Dari Python 3.6 dan seterusnya, standar dict
tipe mempertahankan urutan penyisipan secara default.
Mendefinisikan
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
akan menghasilkan kamus dengan kunci dalam urutan yang tercantum dalam kode sumber.
Ini dicapai dengan menggunakan array sederhana dengan bilangan bulat untuk tabel hash jarang, di mana bilangan bulat indeks ke array lain yang menyimpan pasangan nilai kunci (ditambah hash yang dihitung). Array yang terakhir hanya terjadi untuk menyimpan item dalam urutan penyisipan, dan seluruh kombinasi sebenarnya menggunakan lebih sedikit memori daripada implementasi yang digunakan dalam Python 3.5 dan sebelumnya. Lihat posting ide asli oleh Raymond Hettinger untuk detailnya.
Dalam 3.6 ini masih dianggap sebagai detail implementasi; lihat dokumentasi What's New in Python 3.6 :
Aspek pelestarian pesanan dari implementasi baru ini dianggap sebagai detail implementasi dan tidak boleh diandalkan (ini dapat berubah di masa depan, tetapi diharapkan memiliki implementasi dict baru ini dalam bahasa untuk beberapa rilis sebelum mengubah spesifikasi bahasa untuk mengamanatkan semantik pengawet pesanan untuk semua implementasi Python saat ini dan di masa depan, ini juga membantu menjaga kompatibilitas ke belakang dengan versi bahasa yang lebih lama di mana urutan iterasi acak masih berlaku, misalnya Python 3.5).
Python 3.7 meninggikan detail implementasi ini ke spesifikasi bahasa , jadi sekarang wajib yang dict
menjaga ketertiban di semua implementasi Python yang kompatibel dengan versi itu atau yang lebih baru. Lihat pernyataan oleh BDFL .
Anda mungkin masih ingin menggunakan collections.OrderedDict()
kelas dalam kasus-kasus tertentu, karena ia menawarkan beberapa fungsionalitas tambahan di atas dict
tipe standar . Seperti menjadi reversibel (ini meluas ke objek tampilan ), dan mendukung pemesanan ulang (melalui move_to_end()
metode ).
dict()
dokumentasi bahkan termasuk contoh.mengandung
Jika nilainya
True
(atau objek abadi lainnya), Anda juga dapat menggunakan:sumber
OrderedDict(FUTURE=[], TODAY=[], PAST=[])
akan berhasil, ketika disebutkan pendekatan:OrderedDict([('FUTURE', []), ('TODAY', []), ('PAST', [])])
akan menjaga ketertiban.Daripada menjelaskan bagian teoretis, saya akan memberikan contoh sederhana.
sumber
OrderedDict
memang memecahkan masalah, tetapi ... dalam contoh khusus ini Anda mendapatkan hasil yang persis sama menggunakan kamus standar{'aol': 1, 'foo': 3}
Jadi saya pikir ini adalah contoh ilustrasi yang bagus.OrderedDict.update()
dengan yang berisi pasangan kunci-nilai iterable:d1.upate([(key1, val1), (key2, val2)])
.Perhatikan bahwa jawaban ini berlaku untuk versi python sebelum python3.7. CPython 3.6 mempertahankan urutan penyisipan dalam sebagian besar keadaan sebagai detail implementasi. Mulai dari Python3.7 dan seterusnya, telah dinyatakan bahwa implementasi HARUS mempertahankan urutan penyisipan agar sesuai.
kamus python tidak berurutan. Jika Anda ingin kamus yang dipesan, coba koleksi.OrderedDict .
Perhatikan bahwa OrderedDict diperkenalkan ke perpustakaan standar dengan python 2.7. Jika Anda memiliki versi python yang lebih lama, Anda bisa menemukan resep untuk kamus yang dipesan di ActiveState .
sumber
Kamus akan menggunakan perintah yang membuat pencarian menjadi efisien, dan Anda tidak dapat mengubahnya,
Anda bisa menggunakan daftar objek (elemen 2 tuple dalam kasus sederhana, atau bahkan kelas), dan menambahkan item ke akhir. Anda kemudian dapat menggunakan pencarian linear untuk menemukan item di dalamnya.
Atau Anda bisa membuat atau menggunakan struktur data yang berbeda yang dibuat dengan tujuan mempertahankan pesanan.
sumber
Saya menemukan posting ini sambil mencoba mencari cara agar OrderedDict berfungsi. PyDev untuk Eclipse tidak dapat menemukan OrderedDict sama sekali, jadi saya akhirnya memutuskan untuk membuat tuple dari nilai-nilai kunci kamus saya karena saya ingin mereka dipesan. Ketika saya perlu menampilkan daftar saya, saya hanya mengulangi nilai-nilai tuple dan menyambungkan 'kunci' iterasi dari tuple ke dalam kamus untuk mengambil nilai-nilai saya dalam urutan yang saya butuhkan.
contoh:
Ini sedikit rumit, tapi aku terdesak waktu dan ini solusinya.
catatan: daftar daftar mendekati yang disarankan orang lain tidak masuk akal bagi saya, karena daftar disusun dan diindeks (dan juga struktur yang berbeda dari kamus).
sumber
Anda tidak dapat benar-benar melakukan apa yang Anda inginkan dengan kamus. Kamus Anda sudah
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
dibuat. Saya menemukan tidak ada cara untuk menjaga setelah itu sudah dibuat. Apa yang saya lakukan adalah membuat file json sebagai gantinya dengan objek:Saya menggunakan:
kemudian digunakan:
untuk memverifikasi.
sumber
sumber
Alternatif lain adalah dengan menggunakan Panda
dataframe
karena menjamin urutan dan lokasi indeks item dalam struktur seperti dict.sumber
Umumnya, Anda dapat merancang sebuah kelas yang berperilaku seperti kamus, terutama menjadi menerapkan metode
__contains__
,__getitem__
,__delitem__
,__setitem__
dan beberapa lagi. Kelas itu dapat memiliki perilaku apa pun yang Anda suka, misalnya memberikan iterator yang diurutkan di atas kunci ...sumber
jika Anda ingin memiliki kamus dalam urutan tertentu, Anda juga dapat membuat daftar daftar, di mana item pertama adalah kuncinya, dan item kedua adalah nilainya dan akan terlihat seperti contoh ini
sumber
Saya memiliki masalah serupa ketika mengembangkan proyek Django. Saya tidak bisa menggunakan OrderedDict, karena saya menjalankan versi python lama, jadi solusinya adalah menggunakan kelas SortedDict Django:
https://code.djangoproject.com/wiki/SortedDict
misalnya,
Catatan: Jawaban ini berasal dari tahun 2011. Jika Anda memiliki akses ke Python versi 2.7 atau lebih tinggi, maka Anda harus memiliki akses ke standar sekarang
collections.OrderedDict
, yang banyak contohnya telah disediakan oleh orang lain di utas ini.sumber
Anda dapat melakukan hal yang sama yang saya lakukan untuk kamus.
Buat daftar dan kamus kosong:
sumber