Apa yang akan menjadi cara yang bagus untuk pergi dari {2:3, 1:89, 4:5, 3:0}
ke {1:89, 2:3, 3:0, 4:5}
?
Saya memeriksa beberapa posting tetapi mereka semua menggunakan operator "diurutkan" yang mengembalikan tupel.
python
sorting
dictionary
Antony
sumber
sumber
Jawaban:
Kamus Python standar tidak berurutan. Bahkan jika Anda mengurutkan pasangan (kunci, nilai), Anda tidak akan dapat menyimpannya
dict
dengan cara yang akan mempertahankan pemesanan.Cara termudah adalah menggunakan
OrderedDict
, yang mengingat urutan elemen-elemen yang telah dimasukkan:Tidak masalah cara
od
dicetak; itu akan bekerja seperti yang diharapkan:Python 3
Untuk pengguna Python 3, orang perlu menggunakan
.items()
alih - alih.iteritems()
:sumber
sorted_dict = dict(sorted(unsorted_dict.items()))
Kamus sendiri tidak memiliki barang pesanan seperti itu, jika Anda ingin mencetaknya dll untuk beberapa pesanan, berikut adalah beberapa contoh:
Dalam Python 2.4 dan di atasnya:
memberi:
(Python di bawah 2.4 :)
Sumber: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/
sumber
for key, value in sorted(mydict.items())"
Dari dokumentasi perpustakaan Python
collections
:sumber
reverse=True
misalnyaOrderedDict(sorted(d.items(), reverse=True, key=lambda t: t[0]))
Unexpected type(s): (List[str]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
Untuk CPython / PyPy 3.6, dan Python 3.7 atau lebih tinggi, ini mudah dilakukan dengan:
sumber
{key:d[key] for key in sorted(d.keys())}
Ada sejumlah modul Python yang menyediakan implementasi kamus yang secara otomatis menjaga kunci dalam urutan diurutkan. Pertimbangkan modul yang diurutkan yang merupakan implementasi pure-Python dan fast-as-C. Ada juga perbandingan kinerja dengan opsi populer lainnya yang dibandingkan satu sama lain.
Menggunakan perintah dict adalah solusi yang tidak memadai jika Anda perlu terus-menerus menambah dan menghapus pasangan kunci / nilai sambil juga mengulangi.
Tipe SortedDict juga mendukung pencarian dan penghapusan lokasi yang diindeks yang tidak mungkin dilakukan dengan tipe dikt bawaan.
sumber
Secara sederhana:
Keluaran:
sumber
sd
adalah daftar tupel, bukan kamus. (masih berguna.)Seperti yang disebutkan orang lain, kamus pada dasarnya tidak berurutan. Namun, jika masalah ini hanya menampilkan kamus dengan cara yang teratur, Anda dapat mengganti
__str__
metode dalam subkelas kamus, dan menggunakan kelas kamus ini daripada builtindict
. Misalnya.Catatan, ini tidak mengubah apa pun tentang bagaimana kunci disimpan, urutan mereka akan kembali ketika Anda mengulanginya dll, hanya bagaimana mereka ditampilkan dengan
print
atau di konsol python.sumber
Menemukan cara lain:
upd:
1. ini juga mengurutkan objek bersarang (terima kasih @DanielF).
2. kamus python tidak terurut sehingga ini dapat dijahitkan untuk dicetak atau ditugaskan ke str saja.
sumber
Dalam Python 3.
memberi
sumber
Kamus Python tidak berurutan sebelum Python 3.6. Dalam implementasi CPython dari Python 3.6, kamus menjaga urutan penyisipan. Dari Python 3.7, ini akan menjadi fitur bahasa.
Di changelog dari Python 3.6 ( https://docs.python.org/3.6/whatsnew/3.6.html#whatsnew36-compactdict ):
Dalam dokumen Python 3.7 ( https://docs.python.org/3.7/tutorial/datastructures.html#dictionaries ):
Jadi tidak seperti versi sebelumnya, Anda dapat mengurutkan dict setelah Python 3.6 / 3.7. Jika Anda ingin menyortir dict bersarang termasuk sub-di dalam, Anda dapat melakukan:
https://gist.github.com/ligyxy/f60f0374defc383aa098d44cfbd318eb
sumber
Di sini saya menemukan beberapa solusi paling sederhana untuk mengurutkan python dict dengan menggunakan kunci
pprint
. misalnya.tetapi saat menggunakan pprint itu akan mengembalikan dict dict
sumber
Ada cara mudah untuk mengurutkan kamus.
Sesuai dengan pertanyaan Anda,
Solusinya adalah:
(Di mana c, adalah nama kamus Anda.)
Program ini memberikan output sebagai berikut:
seperti yang kamu inginkan.
Contoh lain adalah:
Memberikan output:
['Albert', 'Bill', 'John', 'Lucy', 'Peter']
Memberikan output:
[18, 24, 32, 36, 41]
Memberikan output:
Oleh karena itu dengan mengubahnya menjadi kunci, nilai, dan item, Anda dapat mencetak seperti apa yang Anda inginkan. Semoga ini bisa membantu!
sumber
Akan menghasilkan apa yang Anda inginkan:
Tapi ini bukan cara yang tepat untuk melakukan ini, karena, itu bisa menunjukkan perilaku yang berbeda dengan kamus yang berbeda, yang telah saya pelajari baru-baru ini. Oleh karena itu cara yang sempurna telah disarankan oleh Tim Dalam tanggapan atas Pertanyaan saya yang saya bagikan di sini.
sumber
Saya pikir hal yang paling mudah adalah dengan mengurutkan dict dengan kunci dan menyimpan kunci yang diurutkan: pasangan nilai dalam dict baru.
Untuk membuatnya lebih jelas:
sumber
Anda dapat membuat kamus baru dengan mengurutkan kamus saat ini berdasarkan kunci sesuai pertanyaan Anda.
Ini kamus Anda
Buat kamus baru d1 dengan mengurutkan ini d menggunakan fungsi lambda
d1 harus {1: 89, 2: 3, 3: 0, 4: 5}, diurutkan berdasarkan kunci dalam d.
sumber
Dicts python tidak dipesan. Biasanya, ini bukan masalah karena use case yang paling umum adalah melakukan pencarian.
Cara paling sederhana untuk melakukan apa yang Anda inginkan adalah dengan membuat
collections.OrderedDict
elemen yang dimasukkan dalam urutan terurut.Jika Anda perlu mengulangi, seperti yang disarankan orang lain di atas, cara paling sederhana adalah dengan mengulangi kunci yang diurutkan. Contoh-
Nilai cetak diurutkan berdasarkan kunci:
Dapatkan daftar nilai yang diurutkan berdasarkan kunci:
sumber
for k,value in sorted(d.items()):
lebih baik: menghindari mengakses dict dengan kunci lagi di loopSaya datang dengan menyortir baris tunggal.
Semoga ini bisa membantu.
sumber
Fungsi ini akan mengurutkan kamus apa pun secara rekursif berdasarkan kuncinya. Artinya, jika nilai apa pun dalam kamus juga merupakan kamus, nilai itu juga akan diurutkan berdasarkan kuncinya. Jika Anda menjalankan CPython 3.6 atau lebih besar, daripada perubahan sederhana untuk menggunakan
dict
daripadaOrderedDict
dapat dibuat.sumber
Kalian membuat hal-hal rumit ... itu sangat sederhana
Outputnya adalah:
sumber
Solusi paling sederhana adalah Anda harus mendapatkan daftar kunci dict diurutkan urutan dan kemudian beralih lebih dari dict. Sebagai contoh
Berikut ini akan menjadi output (desending order)
sumber
Cara mudah untuk melakukan ini:
sumber
Perbandingan waktu dari kedua metode di 2.7 menunjukkan mereka hampir identik:
sumber
sumber
sumber
Atau gunakan
pandas
,Demo:
Lihat:
sumber
Saran saya adalah ini karena memungkinkan Anda untuk mengurutkan dict atau menyimpan dict diurutkan saat Anda menambahkan item dan mungkin perlu menambahkan item di masa depan:
Bangun
dict
mulai dari awal. Memiliki struktur data kedua, daftar, dengan daftar kunci Anda. Paket bisect memiliki fungsi insort yang memungkinkan memasukkan ke dalam daftar yang disortir, atau mengurutkan daftar Anda setelah benar-benar mengisi dict Anda. Sekarang, ketika Anda mengulangi dict Anda, Anda sebaliknya beralih ke daftar untuk mengakses setiap kunci secara berurutan tanpa khawatir tentang representasi struktur dict (yang tidak dibuat untuk menyortir).sumber
sumber