Ada fungsi yang sudah ada yang berakhir sebagai berikut, di mana d
kamus:
return d.iteritems()
yang mengembalikan iterator yang tidak disortir untuk kamus yang diberikan. Saya ingin mengembalikan iterator yang melewati item yang diurutkan berdasarkan kunci . Bagaimana aku melakukan itu?
python
sorting
dictionary
mike
sumber
sumber
.items()
alih-alihiteritems()
: seperti yang dikatakan @Claudiu, iteritems tidak berfungsi untuk Python 3.x, tetapiitems()
tersedia dari Python 2.6.items()
membuat daftar dan karenanya menggunakan memori, sedangkaniteritems()
pada dasarnya tidak menggunakan memori. Apa yang digunakan sebagian besar tergantung pada ukuran kamus. Selain itu, alat konversi Python 2 ke Python 32to3
otomatis ( ) secara otomatis menangani konversi dariiteritems()
keitems()
, sehingga tidak perlu khawatir tentang hal ini.collections.OrderedDict
lalu Anda mengurutkan sekali & mendapatkan item dalam urutan diurutkan selalu.iteritems()
tidak menggunakan memori, semuanya harus ditarik ke dalam memorisorted()
, jadi tidak ada perbedaan antara penggunaanitems()
dan diiteritems()
sini dari segi memori.items()
(dalam daftar dikembalikan olehitems()
, dan dalam daftar diurutkan) dan hanya sekali denganiteritems()
(dalam daftar diurutkan saja).Gunakan
sorted()
fungsinya:Jika Anda ingin iterator aktual atas hasil yang diurutkan, sejak
sorted()
mengembalikan daftar, gunakan:sumber
Kunci dikt disimpan dalam hashtable sehingga merupakan 'tatan alami' mereka, yaitu psuedo-random. Pemesanan lainnya adalah konsep konsumen dikt.
diurutkan () selalu mengembalikan daftar, bukan dict. Jika Anda memberikannya dict.items () (yang menghasilkan daftar tupel), itu akan mengembalikan daftar tupel [(k1, v1), (k2, v2), ...] yang dapat digunakan dalam satu lingkaran dengan cara yang sangat mirip dengan dict, tetapi itu tidak berarti pula dict !
Berikut ini terasa seperti dict dalam satu lingkaran, tetapi bukan, itu adalah daftar tuple yang dibongkar menjadi k, v:
Setara dengan:
sumber
sorted(foo.keys())
lebih baik sebagai padanansorted(foo)
, karena kamus mengembalikan kunci mereka ketika iterasi (dengan keuntungan tidak dipaksa untuk membuatfoo.keys()
daftar perantara, mungkin — tergantung pada bagaimanasorted()
diterapkan untuk iterables).k in sorted(foo.keys()):
yang menarik kunci ataufor k,v in sorted(foo.items()):
yang mengembalikan salinan pasangan daftar kamus yang kurasasorted(foo.keys())
Jawaban Greg benar. Perhatikan bahwa dalam Python 3.0 Anda harus melakukannya
seperti yang
iteritems
akan hilang.sumber
Anda sekarang dapat menggunakan
OrderedDict
Python 2.7 juga:Di sini Anda memiliki halaman apa yang baru untuk versi 2.7 dan API OrderedDict .
sumber
Secara umum, seseorang dapat mengurutkan dict seperti:
Untuk kasus spesifik dalam pertanyaan, memiliki "drop in replacement" untuk d.iteritems (), tambahkan fungsi seperti:
dan garis akhir berubah dari
untuk
atau
sumber
Metode ini masih memiliki semacam O (N log N), namun, setelah heapify linier pendek, ia menghasilkan item dalam urutan diurutkan saat berjalan, membuatnya secara teoritis lebih efisien ketika Anda tidak selalu membutuhkan seluruh daftar.
sumber
Jika Anda ingin mengurutkan berdasarkan urutan item yang dimasukkan dan bukan urutan kunci, Anda harus melihat ke koleksi Python .OrderedDict . (Hanya Python 3)
sumber
diurutkan mengembalikan daftar, maka kesalahan Anda ketika Anda mencoba untuk mengulanginya, tetapi karena Anda tidak dapat memesan dict Anda harus berurusan dengan daftar.
Saya tidak tahu apa konteks kode Anda yang lebih besar, tetapi Anda bisa mencoba menambahkan iterator ke daftar yang dihasilkan. seperti ini mungkin ?:
tentu saja Anda akan mendapatkan kembali tuple sekarang karena diurutkan mengubah dict Anda menjadi daftar tuple
mis: katakanlah dikt Anda:
{'a':1,'c':3,'b':2}
diurutkan mengubahnya menjadi daftar:jadi ketika Anda benar-benar mengulangi daftar Anda kembali (dalam contoh ini) sebuah tupel yang terdiri dari string dan integer, tetapi setidaknya Anda akan dapat beralih di atasnya.
sumber
Dengan asumsi Anda menggunakan CPython 2.x dan memiliki mydict kamus besar, maka menggunakan sortir (mydict) akan menjadi lambat karena disortir membuat daftar kunci-kunci mydict yang diurutkan.
Dalam hal ini Anda mungkin ingin melihat paket ddt saya yang memuat implementasi C dari
sorteddict
di C. Terutama jika Anda harus memeriksa daftar kunci yang diurutkan beberapa kali pada tahap yang berbeda (mis. Jumlah elemen) dari masa kamus.http://anthon.home.xs4all.nl/Python/ordereddict/
sumber