Perhatikan kamus berikut, d:
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
Saya ingin mengembalikan kunci N pertama: pasangan nilai dari d (N <= 4 dalam kasus ini). Metode apa yang paling efisien untuk melakukan ini?
python
dictionary
Jason Strimpel
sumber
sumber
list(d.items())[:4]
. list () adalah implementasi yang mendasari banyak jawaban.Jawaban:
Tidak ada yang namanya kunci "n pertama" karena a
dict
tidak ingat kunci mana yang dimasukkan lebih dulu.Anda bisa mendapatkan setiap pasangan n kunci-nilai meskipun:
Ini menggunakan implementasi
take
dariitertools
resep :Lihat itu bekerja secara online: ideone
Pembaruan untuk Python 3.6
sumber
iteritems
harus diganti denganitems
untuk orang-orang di Python 3take()
bagian dari basis kode python di mana saja? Atau, apakah ini murni fungsi yang Anda tentukan dalam jawaban Anda di sini? Bertanya seolah-olah itu adalah bagian dari basis kode, saya tidak dapat menemukan / mengimpornya. :)Cara yang sangat efisien untuk mengambil apa pun adalah dengan menggabungkan pemahaman daftar atau kamus dengan pengirisan. Jika Anda tidak perlu memesan item (Anda hanya ingin n pasang acak), Anda dapat menggunakan pemahaman kamus seperti ini:
Umumnya pemahaman seperti ini selalu lebih cepat dijalankan daripada pengulangan "untuk x dalam y" yang setara. Selain itu, dengan menggunakan .keys () untuk membuat daftar kunci kamus dan memotong daftar itu, Anda menghindari 'menyentuh' tombol yang tidak perlu saat Anda membuat kamus baru.
Jika Anda tidak memerlukan kunci (hanya nilai), Anda dapat menggunakan pemahaman daftar:
Jika Anda membutuhkan nilai yang diurutkan berdasarkan kuncinya, itu tidak lebih merepotkan:
atau jika Anda juga membutuhkan kuncinya:
sumber
S Python
dict
tidak berurut, jadi tidak ada artinya meminta kunci "N pertama".The
collections.OrderedDict
kelas tersedia jika itu yang Anda butuhkan. Anda bisa secara efisien mendapatkan empat elemen pertamanya sebagaiitertools.islice
memungkinkan Anda untuk dengan malas mengambil sepotong elemen dari iterator mana pun. Jika Anda ingin hasilnya dapat digunakan kembali, Anda perlu mengubahnya menjadi daftar atau semacamnya, seperti ini:sumber
Pada dasarnya, ubah tampilan (dict_items) menjadi iterator, lalu lakukan iterasi dengan next ().
sumber
Tidak melihatnya di sini. Tidak akan dipesan tetapi yang paling sederhana secara sintaksis jika Anda hanya perlu mengambil beberapa elemen dari kamus.
sumber
TypeError: 'dict_items' object is not subscriptable
{key:value for key,value in stocks.items()[0:n]}
(saham adalah nama kamus saya)Untuk mendapatkan elemen N teratas dari kamus python Anda, seseorang dapat menggunakan baris kode berikut:
Dalam kasus Anda, Anda dapat mengubahnya menjadi:
sumber
Lihat PEP 0265 tentang pengurutan kamus. Kemudian gunakan kode iterable yang disebutkan di atas.
Jika Anda membutuhkan efisiensi lebih dalam pasangan kunci-nilai yang diurutkan. Gunakan struktur data yang berbeda. Yaitu, yang mempertahankan urutan terurut dan pengaitan nilai kunci.
Misalnya
sumber
di py3, ini akan berhasil
{'a': 3, 'b': 2, 'c': 3, 'd': 4}
sumber
tambahkan saja jawaban menggunakan zip,
sumber
Ini tergantung pada apa yang 'paling efisien' dalam kasus Anda.
Jika Anda hanya ingin sampel semi-acak dari kamus besar
foo
, menggunakanfoo.iteritems()
dan mengambil nilai sebanyak yang Anda butuhkan, ini adalah operasi malas yang menghindari pembuatan daftar eksplisit kunci atau item.Jika Anda perlu mengurutkan kunci terlebih dahulu, tidak ada cara lain untuk menggunakan sesuatu seperti
keys = foo.keys(); keys.sort()
atausorted(foo.iterkeys())
, Anda harus membuat daftar kunci yang eksplisit. Kemudian iris atau ulangi melalui N pertamakeys
.BTW mengapa Anda peduli dengan cara 'efisien'? Apakah Anda membuat profil program Anda? Jika tidak, gunakan cara yang jelas dan mudah dipahami terlebih dahulu. Kemungkinannya akan berhasil dengan baik tanpa menjadi hambatan.
sumber
Anda dapat melakukan pendekatan ini dengan berbagai cara. Jika pesanan penting, Anda dapat melakukan ini:
Jika pesanan bukan masalah, Anda dapat melakukan ini:
sumber
value
bukanitem
untuk kejelasan.Dictionary tidak memiliki urutan, jadi sebelum memilih pasangan nilai kunci N teratas, mari kita lakukan pengurutan.
Sekarang kita dapat melakukan pengambilan elemen 'N' teratas :, menggunakan struktur metode seperti ini:
untuk mendapatkan 2 elemen teratas, cukup gunakan struktur ini:
sumber
Untuk Python 3 ke atas, Untuk memilih n Pasangan pertama
sumber
pertimbangkan sebuah dikt
islice akan melakukan triknya :) semoga bisa membantu!
sumber
Ini mungkin tidak terlalu elegan, tetapi berhasil untuk saya:
sumber
Saya telah mencoba beberapa jawaban di atas dan mencatat bahwa beberapa di antaranya bergantung pada versi dan tidak berfungsi di versi 3.7.
Saya juga mencatat bahwa sejak 3.6 semua kamus diurutkan berdasarkan urutan penyisipan item.
Meskipun kamus diurutkan sejak 3.6, beberapa pernyataan yang Anda harapkan bisa bekerja dengan struktur yang teratur sepertinya tidak berfungsi.
Jawaban atas pertanyaan OP yang paling cocok untuk saya.
sumber
lst = list(d.items())[:N]
Pendekatan yang tidak biasa, karena memberikan kompleksitas waktu O (N) yang intens.
sumber