Apakah mungkin untuk membuat pemahaman kamus dengan Python (untuk kunci)?
Tanpa pemahaman daftar, Anda dapat menggunakan sesuatu seperti ini:
l = []
for n in range(1, 11):
l.append(n)
Kami dapat mempersingkat ini ke daftar pemahaman: l = [n for n in range(1, 11)]
.
Namun, katakan saya ingin mengatur kunci kamus ke nilai yang sama. Dapat saya lakukan:
d = {}
for n in range(1, 11):
d[n] = True # same value for each
Saya sudah mencoba ini:
d = {}
d[i for i in range(1, 11)] = True
Namun, saya mendapatkan SyntaxError
pada for
.
Selain itu (saya tidak memerlukan bagian ini, tetapi hanya ingin tahu), dapatkah Anda mengatur kunci kamus ke sekelompok nilai yang berbeda, seperti ini:
d = {}
for n in range(1, 11):
d[n] = n
Apakah ini mungkin dengan pemahaman kamus?
d = {}
d[i for i in range(1, 11)] = [x for x in range(1, 11)]
Ini juga menimbulkan SyntaxError
pada for
.
python
dictionary
list-comprehension
Panchal yang terburu-buru
sumber
sumber
Jawaban:
Ada pemahaman kamus di Python 2.7+ , tetapi mereka tidak berfungsi seperti yang Anda coba. Seperti pemahaman daftar, mereka membuat kamus baru ; Anda tidak dapat menggunakannya untuk menambahkan kunci ke kamus yang ada. Selain itu, Anda harus menentukan kunci dan nilai, meskipun tentu saja Anda dapat menentukan nilai dummy jika Anda mau.
Jika Anda ingin mengatur semuanya ke True:
Apa yang tampaknya Anda tanyakan adalah cara untuk mengatur beberapa kunci sekaligus pada kamus yang ada. Tidak ada jalan pintas langsung untuk itu. Anda bisa mengulang seperti yang sudah Anda tunjukkan, atau Anda bisa menggunakan pemahaman kamus untuk membuat dict baru dengan nilai-nilai baru, dan kemudian lakukan
oldDict.update(newDict)
untuk menggabungkan nilai-nilai baru ke dalam dict lama.sumber
dict.update
juga dapat menerima iterable dari pasangan kunci-nilai sepertidict
konstruktordict.fromkeys()
. Jadi untuk mengatur semua nilaiTrue
, gunakandict.fromkeys(range(5), True)
. Hati-hati, nilainya tidak disalin , jadi Anda mungkin ingin menghindari ini ketika Anda memiliki nilai yang bisa diubah; itu akan dibagikan di antara semua kunci.{ n*2 : n for n in range(3) } => {0: 0, 2: 1, 4: 2}
. Keduanya dapat dilakukan dalam ekspresi yang sama:{ n*2 : n*3 for n in range(3) } => { 0: 0, 2: 3, 4: 6 }
.Anda dapat menggunakan
dict.fromkeys
metode kelas ...Ini adalah cara tercepat untuk membuat kamus tempat semua kunci dipetakan dengan nilai yang sama.
Tapi jangan tidak menggunakan ini dengan benda bisa berubah :
Jika Anda tidak benar-benar perlu menginisialisasi semua kunci,
defaultdict
mungkin berguna juga:Untuk menjawab bagian kedua, pemahaman-dikt adalah apa yang Anda butuhkan:
Anda mungkin tidak seharusnya melakukan ini tetapi Anda juga bisa membuat subclass
dict
yang berfungsi agak sepertidefaultdict
jika Anda menimpa__missing__
:sumber
d = defaultdict(lambda: True)
, lambda tidak diperlukan karena True (atau seharusnya tidak) tidak bisa berubah.sumber
Saya sangat suka komentar @mgilson, karena jika Anda memiliki dua iterables, satu yang sesuai dengan kunci dan yang lainnya nilainya, Anda juga dapat melakukan hal berikut.
memberi
sumber
{i:j for i in keys for j in values}
Gunakan dict () pada daftar tupel, solusi ini akan memungkinkan Anda untuk memiliki nilai arbitrer di setiap daftar, asalkan mereka memiliki panjang yang sama
sumber
d = dict(zip(i_s,x_s))
Pertimbangkan contoh ini menghitung kemunculan kata-kata dalam daftar menggunakan pemahaman kamus
Dan hasilnya adalah
sumber
Tujuan utama dari pemahaman daftar adalah untuk membuat daftar baru berdasarkan yang lain tanpa mengubah atau menghancurkan daftar asli.
Alih-alih menulis
atau
Anda harus menulis saja
Di dua blok kode teratas Anda membuat daftar baru, mengulanginya dan hanya mengembalikan setiap elemen. Itu hanya cara mahal untuk membuat salinan daftar.
Untuk mendapatkan kamus baru dengan semua kunci disetel ke nilai yang sama berdasarkan dikt lain, lakukan ini:
Anda menerima SyntaxError karena ketika Anda menulis
Anda pada dasarnya mengatakan: "Tetapkan kunci saya 'i for i in range (1, 11)' ke True" dan "i for i in range (1, 11)" bukan kunci yang valid, itu hanya kesalahan sintaksis. Jika dikte mendukung daftar sebagai kunci, Anda akan melakukan sesuatu seperti
dan tidak
tetapi daftar tidak dapat di hash, jadi Anda tidak dapat menggunakannya sebagai kunci dict.
sumber
Anda tidak dapat hash daftar seperti itu. coba ini sebagai gantinya, ini menggunakan tuple
sumber