Buat kamus dengan pemahaman daftar


Jawaban:


1898

Dari Python 2.7 dan 3 dan seterusnya, Anda harus menggunakan sintaks pemahaman dict :

{key: value for (key, value) in iterable}

Dalam Python 2.6 dan sebelumnya, dictbuilt-in dapat menerima iterable pasangan kunci / nilai, sehingga Anda bisa memberikannya pemahaman daftar atau ekspresi generator. Sebagai contoh:

dict((key, func(key)) for key in keys)

Namun jika Anda sudah memiliki iterable (s) kunci dan / atau vals, Anda tidak perlu menggunakan pemahaman sama sekali - itu paling sederhana hanya memanggil dictbuilt-in secara langsung:

# consumed from any iterable yielding pairs of keys/vals
dict(pairs)

# "zipped" from two separate iterables of keys/vals
dict(zip(list_of_keys, list_of_values))

1
bagaimana jika saya memiliki daftar kata-kata ['kucing', 'anjing', 'kucing'] dan saya ingin membuat dikt dengan kunci sebagai kata dan nilai sebagai hitungan? Apakah ada sintaks efisien pendek untuk itu?
cryanbhu

@cryanbhu jika yang Anda maksud adalah menghitung pengulangan elemen yang diberikan dalam daftar, ada kelas Counter dalam paket koleksi: docs.python.org/2/library/collections.html#collections.Counter
fortran

237

Dalam Python 3 dan Python 2.7+, pemahaman kamus terlihat seperti di bawah ini:

d = {k:v for k, v in iterable}

Untuk Python 2.6 atau sebelumnya, lihat jawaban fortran .


57

Bahkan, Anda bahkan tidak perlu mengulangi iterable jika sudah memahami semacam pemetaan, konstruktor dikt melakukannya dengan ramah untuk Anda:

>>> ts = [(1, 2), (3, 4), (5, 6)]
>>> dict(ts)
{1: 2, 3: 4, 5: 6}
>>> gen = ((i, i+1) for i in range(1, 6, 2))
>>> gen
<generator object <genexpr> at 0xb7201c5c>
>>> dict(gen)
{1: 2, 3: 4, 5: 6}

40

Dalam Python 2.7, seperti:

>>> list1, list2 = ['a', 'b', 'c'], [1,2,3]
>>> dict( zip( list1, list2))
{'a': 1, 'c': 3, 'b': 2}

Zip mereka !


11
Ini sama sekali tidak menjawab pertanyaan.
Jean-François Corbett

32

Buat kamus dengan pemahaman daftar dalam Python

Saya suka sintaks pemahaman daftar Python.

Apakah bisa digunakan untuk membuat kamus juga? Misalnya, dengan mengulangi pasangan kunci dan nilai:

mydict = {(k,v) for (k,v) in blah blah blah}

Anda sedang mencari frasa "pemahaman dict" - sebenarnya:

mydict = {k: v for k, v in iterable}

Dengan asumsi itu blah blah blahadalah iterable dari dua tupel - Anda sangat dekat. Mari kita buat beberapa "bla" seperti itu:

blahs = [('blah0', 'blah'), ('blah1', 'blah'), ('blah2', 'blah'), ('blah3', 'blah')]

Sintaks pemahaman diktik:

Sekarang sintaks di sini adalah bagian pemetaan. Apa yang menjadikan ini sebuah dictpemahaman alih-alih sebuah setpemahaman (yang kira-kira seperti kode pseudo Anda) adalah titik dua, :seperti di bawah ini:

mydict = {k: v for k, v in blahs}

Dan kita melihat bahwa itu berhasil, dan harus mempertahankan urutan penyisipan sebagai-of Python 3.7:

>>> mydict
{'blah0': 'blah', 'blah1': 'blah', 'blah2': 'blah', 'blah3': 'blah'}

Dalam Python 2 dan hingga 3,6, pesanan tidak dijamin:

>>> mydict
{'blah0': 'blah', 'blah1': 'blah', 'blah3': 'blah', 'blah2': 'blah'}

Menambahkan Filter:

Semua pemahaman memiliki komponen pemetaan dan komponen penyaringan yang dapat Anda berikan dengan ekspresi sewenang-wenang.

Jadi, Anda dapat menambahkan bagian filter hingga akhir:

>>> mydict = {k: v for k, v in blahs if not int(k[-1]) % 2}
>>> mydict
{'blah0': 'blah', 'blah2': 'blah'}

Di sini kita hanya menguji apakah karakter terakhir dapat dibagi 2 untuk menyaring data sebelum memetakan kunci dan nilai.


23

Versi Python <2.7 (RIP, 3 Juli 2010 - 31 Desember 2019) , lakukan hal berikut:

d = dict((i,True) for i in [1,2,3])

Versi Python> = 2.7, lakukan hal berikut:

d = {i: True for i in [1,2,3]}

22

Untuk menambahkan jawaban @ fortran, jika Anda ingin mengulangi daftar kunci key_listdan daftar nilai value_list:

d = dict((key, value) for (key, value) in zip(key_list, value_list))

atau

d = {(key, value) for (key, value) in zip(key_list, value_list)}

6

Berikut adalah contoh lain dari pembuatan kamus menggunakan pemahaman dict:

Yang ingin saya lakukan di sini adalah membuat kamus alfabet tempat masing-masing pasangan; adalah huruf bahasa Inggris dan posisinya yang sesuai dalam abjad bahasa Inggris

>>> import string
>>> dict1 = {value: (int(key) + 1) for key, value in 
enumerate(list(string.ascii_lowercase))}
>>> dict1
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 
'k': 11, 'j': 10, 'm': 13, 'l': 12, 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's': 
19, 'r': 18, 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26}
>>> 

Perhatikan penggunaan penghitungan di sini untuk mendapatkan daftar huruf dan indeks mereka dalam daftar dan menukar huruf dan indeks untuk menghasilkan pasangan nilai kunci untuk kamus

Semoga ini memberi Anda ide yang baik tentang kamus comp untuk Anda dan mendorong Anda untuk menggunakannya lebih sering untuk membuat kode Anda kompak


1
Jawaban yang bagus - disederhanakan:d = {k: v+1 for v, k in enumerate(string.ascii_lowercase)}
johnnydrama

4

Coba ini,

def get_dic_from_two_lists(keys, values):
    return { keys[i] : values[i] for i in range(len(keys)) }

Asumsikan kita memiliki dua daftar negara dan modal

country = ['India', 'Pakistan', 'China']
capital = ['New Delhi', 'Islamabad', 'Beijing']

Kemudian buat kamus dari dua daftar:

print get_dic_from_two_lists(country, capital)

Outputnya seperti ini,

{'Pakistan': 'Islamabad', 'China': 'Beijing', 'India': 'New Delhi'}

9
Anda bisa menggunakan zip
Andre Simon

2
>>> {k: v**3 for (k, v) in zip(string.ascii_lowercase, range(26))}

Python mendukung pemahaman dict, yang memungkinkan Anda untuk mengekspresikan pembuatan kamus saat runtime menggunakan sintaksis yang sama ringkasnya.

Pemahaman kamus menggunakan bentuk {key: value for (key, value) di iterable}. Sintaks ini diperkenalkan dalam Python 3 dan di-backport sejauh Python 2.7, jadi Anda harus dapat menggunakannya terlepas dari versi Python mana yang telah Anda instal.

Contoh kanonik mengambil dua daftar dan membuat kamus di mana item di setiap posisi dalam daftar pertama menjadi kunci dan item di posisi yang sesuai di daftar kedua menjadi nilainya.

Fungsi zip yang digunakan di dalam pemahaman ini mengembalikan sebuah iterator tupel, di mana setiap elemen dalam tupel diambil dari posisi yang sama di setiap iterables input. Pada contoh di atas, iterator yang dikembalikan berisi tupel ("a", 1), ("b", 2), dll.

Keluaran:

{'i': 512, 'e': 64, 'o': 2744, 'h': 343, 'l': 1331, 's': 5832, 'b': 1, 'w': 10648, ' c ': 8,' x ': 12167,' y ': 13824,' t ': 6859,' p ': 3375,' d ': 27,' j ': 729,' a ': 0,' z ' : 15625, 'f': 125, 'q': 4096, 'u': 8000, 'n': 2197, 'm': 1728, 'r': 4913, 'k': 1000, 'g': 216 , 'v': 9261}


2

Kode ini akan membuat kamus menggunakan pemahaman daftar untuk banyak daftar dengan nilai berbeda yang dapat digunakan untuk pd.DataFrame()

#Multiple lists 
model=['A', 'B', 'C', 'D']
launched=[1983,1984,1984,1984]
discontinued=[1986, 1985, 1984, 1986]

#Dictionary with list comprehension
keys=['model','launched','discontinued']
vals=[model, launched,discontinued]
data = {key:vals[n] for n, key in enumerate(keys)}

enumerateakan lolos nke valsuntuk mencocokkan masing key- masing dengan daftar


1

Hanya dengan melemparkan contoh lain. Bayangkan Anda memiliki daftar berikut:

nums = [4,2,2,1,3]

dan Anda ingin mengubahnya menjadi dict di mana kuncinya adalah indeks dan nilai adalah elemen dalam daftar. Anda dapat melakukannya dengan baris kode berikut:

{index:nums[index] for index in range(0,len(nums))}

0

Anda dapat membuat dict baru untuk setiap pasangan dan menggabungkannya dengan dict sebelumnya:

reduce(lambda p, q: {**p, **{q[0]: q[1]}}, bla bla bla, {})

Jelas pendekatan ini membutuhkan reducedari functools.


ide yang sama: kurangi (lambda p, q: {** p, ** dict ([q])}, bla bla bla, {})
Mahmoud Khaled
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.