Bayangkan Anda memiliki:
keys = ['name', 'age', 'food']
values = ['Monty', 42, 'spam']
Apa cara paling sederhana untuk menghasilkan kamus berikut?
a_dict = {'name' : 'Monty', 'age' : 42, 'food' : 'spam'}
python
list
dictionary
Guido
sumber
sumber
dictionary = {zip(keys, values)}
itu tidak akan berhasil. Anda harus secara eksplisit mendeklarasikan sebagaidict(...)
{thing}
adalah gula sintaksis untuk membangunset()
unsur yang mengandung satu.{*iterable}
adalah gula sintaksis untuk membangunset
beberapa elemen yang mengandung.{k:v}
atau{**mapping}
akan membangundict
, tapi itu secara sintaksis sangat berbeda.{}
untuk kamus. Padahal, jika kita cobatype({})
outputnya adalahdict
. Tapi memang, jika kita cobatype({thing})
maka outputnya adalahset
.{k:v for k, v in zip(keys, values)}
. Ternyata kita bisa. +1.Kebanyakan berkinerja,
dict
dengan konstruktorzip
Dalam Python 3, zip sekarang mengembalikan iterator malas, dan sekarang ini adalah pendekatan yang paling performan.
dict(zip(keys, values))
memang membutuhkan pencarian global satu kali untuk masing-masingdict
danzip
, tetapi tidak membentuk struktur data menengah yang tidak perlu atau harus berurusan dengan pencarian lokal dalam aplikasi fungsi.Runner-up, pemahaman dict:
Runner-up yang dekat untuk menggunakan konstruktor dict adalah dengan menggunakan sintaks asli dari pemahaman dict (bukan pemahaman daftar , seperti yang orang lain katakan secara keliru):
Pilih ini saat Anda perlu memetakan atau memfilter berdasarkan kunci atau nilai.
Dalam Python 2,
zip
mengembalikan daftar, untuk menghindari membuat daftar yang tidak perlu, gunakanizip
sebagai gantinya (alias zip dapat mengurangi perubahan kode ketika Anda pindah ke Python 3).Jadi itu masih (2.7):
Python 2, ideal untuk <= 2.6
izip
dariitertools
menjadizip
di Python 3.izip
lebih baik daripada zip untuk Python 2 (karena menghindari pembuatan daftar yang tidak perlu), dan ideal untuk 2.6 atau di bawah:Hasil untuk semua kasus:
Dalam semua kasus:
Penjelasan:
Jika kita melihat bantuan pada
dict
kita melihat bahwa dibutuhkan berbagai bentuk argumen:Pendekatan optimal adalah dengan menggunakan iterable sambil menghindari membuat struktur data yang tidak perlu. Di Python 2, zip membuat daftar yang tidak perlu:
Dalam Python 3, yang sederajat adalah:
dan Python 3
zip
hanya menciptakan objek yang dapat diubah:Karena kami ingin menghindari membuat struktur data yang tidak perlu, kami biasanya ingin menghindari Python 2
zip
(karena membuat daftar yang tidak perlu).Alternatif yang kurang berkinerja:
Ini adalah ekspresi generator yang diteruskan ke konstruktor dikt:
atau yang setara:
Dan ini adalah daftar pemahaman yang diteruskan ke konstruktor dikt:
Dalam dua kasus pertama, lapisan tambahan dari perhitungan non-operasi (dengan demikian tidak perlu) ditempatkan di atas zip iterable, dan dalam hal pemahaman daftar, daftar tambahan tidak perlu dibuat. Saya berharap mereka semua menjadi kurang performan, dan tentu saja tidak lebih.
Ulasan kinerja:
Dalam 64 bit Python 3.8.2 disediakan oleh Nix, di Ubuntu 16.04, dipesan dari yang tercepat hingga yang paling lambat:
dict(zip(keys, values))
menang bahkan dengan set kunci dan nilai yang kecil, tetapi untuk set yang lebih besar, perbedaan dalam kinerja akan menjadi lebih besar.Seorang komentator berkata:
Kami menggunakan
min
karena algoritma ini bersifat deterministik. Kami ingin mengetahui kinerja algoritma dalam kondisi terbaik.Jika sistem operasi hang untuk alasan apa pun, itu tidak ada hubungannya dengan apa yang kami coba bandingkan, jadi kami perlu mengecualikan hasil semacam itu dari analisis kami.
Jika kita menggunakan
mean
, peristiwa semacam itu akan sangatmax
memengaruhi hasil kita, dan jika kita menggunakan kita hanya akan mendapatkan hasil yang paling ekstrim - yang kemungkinan besar dipengaruhi oleh peristiwa semacam itu.Seorang komentator juga mengatakan:
Saya kira kita maksud
dict(zip(...
dengan angka acak 10k. Itu terdengar seperti kasus penggunaan yang tidak biasa. Masuk akal bahwa panggilan paling langsung akan mendominasi dalam dataset besar, dan saya tidak akan terkejut jika OS hang mendominasi mengingat berapa lama waktu yang dibutuhkan untuk menjalankan tes itu, lebih lanjut condong angka Anda. Dan jika Anda menggunakanmean
ataumax
saya akan menganggap hasil Anda tidak berarti.Mari kita gunakan ukuran yang lebih realistis pada contoh teratas kami:
Dan kita lihat di sini bahwa
dict(zip(...
memang berjalan lebih cepat untuk kumpulan data yang lebih besar sekitar 20%.sumber
dict(zip(headList, textList))
& 1,95 \ pm 0,030 mikro untuk{k: v for k, v in zip(headList, textList)}
. Saya akan menyarankan yang pertama untuk keterbacaan dan kecepatan. Jelas ini menjadi argumen min () vs mean () untuk timeit.min
Sepertinya cara yang buruk untuk membandingkan kinerja. Tentunyamean
dan / ataumax
akan menjadi indikator yang jauh lebih berguna untuk penggunaan nyata.dict
panggilan ini sekitar 10% lebih cepat.Coba ini:
Dalam Python 2, itu juga lebih ekonomis dalam konsumsi memori dibandingkan dengan
zip
.sumber
zip
sudah ekonomis dalam konsumsi memori. docs.python.org/3/library/functions.html#zip Bahkan, Anda dapat melihat bahwasix
menggunakanzip
Python 3 untuk menggantikanitertools.izip
Python 2 pythonhosted.org/six .sumber
Anda juga dapat menggunakan pemahaman kamus dengan Python ≥ 2.7:
sumber
Cara yang lebih alami adalah dengan menggunakan pemahaman kamus
sumber
dict
objek, mengapa begitu?, terima kasih Bung.Jika Anda perlu mengubah kunci atau nilai sebelum membuat kamus, maka ekspresi generator dapat digunakan. Contoh:
Lihatlah Kode Seperti Pythonista: Idiomatic Python .
sumber
dengan Python 3.x, berlaku untuk pemahaman dict
Lebih lanjut tentang pemahaman dikt di sini , contoh ada di sana:
sumber
Bagi mereka yang membutuhkan kode sederhana dan tidak terbiasa dengan
zip
:Ini dapat dilakukan dengan satu baris kode:
sumber
List1
lebih lama dariList2
for n in range(len(List1))
merupakan anti-polaSolusi terbaik masih:
Tranpose itu:
sumber
Anda dapat menggunakan kode di bawah ini:
Tetapi pastikan bahwa panjang daftar akan sama. Jika panjangnya tidak sama, maka fungsi zip akan lebih panjang.
sumber
Saya memiliki keraguan ini ketika saya mencoba untuk menyelesaikan masalah yang berhubungan dengan grafik. Masalah yang saya miliki adalah saya perlu mendefinisikan daftar adjacency kosong dan ingin menginisialisasi semua node dengan daftar kosong, saat itulah saya berpikir bagaimana kalau saya periksa apakah cukup cepat, maksud saya jika layak melakukan operasi zip daripada pasangan nilai kunci penugasan sederhana. Bagaimanapun juga, faktor waktu adalah pemecah es yang penting. Jadi saya melakukan operasi timeit untuk kedua pendekatan.
Untuk n_nodes = 10.000.000 saya dapatkan,
Iterasi: 2.825081646999024 Singkatan: 3.535717916001886
Iterasi: 5.051560923002398 Singkatan: 6.255070794999483
Iterasi: 6.52859034499852 Singkatan: 8.221581164998497
Iterasi: 8.683652416999394 Singkatan: 12.599181543999293
Iterasi: 11.587241565001023 Singkatan: 15.27298851100204
Iterasi: 14.816342867001367 Singkatan: 17.162912737003353
Iterasi: 16.645022411001264 Singkatan: 19.976680120998935
Anda dapat melihat dengan jelas setelah titik tertentu, pendekatan iterasi pada langkah n_th mengambil alih waktu yang diambil oleh pendekatan steno pada langkah n-1_th.
sumber
Ini juga contoh menambahkan nilai daftar di kamus Anda
selalu pastikan "Kunci" Anda (list1) selalu di parameter pertama.
sumber
Solusi sebagai pemahaman kamus dengan menyebutkan:
Solusi untuk loop dengan penghitungan:
sumber
Anda juga dapat mencoba dengan satu daftar yang merupakan kombinasi dari dua daftar;)
sumber
metode tanpa fungsi zip
sumber