Jawaban:
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, dict
built-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 dict
built-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))
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 .
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}
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 !
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 blah
adalah iterable dari dua tupel - Anda sangat dekat. Mari kita buat beberapa "bla" seperti itu:
blahs = [('blah0', 'blah'), ('blah1', 'blah'), ('blah2', 'blah'), ('blah3', 'blah')]
Sekarang sintaks di sini adalah bagian pemetaan. Apa yang menjadikan ini sebuah dict
pemahaman alih-alih sebuah set
pemahaman (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'}
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.
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]}
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
d = {k: v+1 for v, k in enumerate(string.ascii_lowercase)}
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'}
>>> {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}
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)}
enumerate
akan lolos n
ke vals
untuk mencocokkan masing key
- masing dengan daftar
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))}
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 reduce
dari functools
.
collections.Counter
adalah jenis dikte khusus untuk menghitung hal-hal: Menggunakan kamus untuk menghitung item dalam daftar