Pada Python 3.6 , built-in dict akan dipesan
Kabar baik, sehingga kasus penggunaan asli OP pasangan pemetaan diambil dari database dengan id string unik sebagai kunci dan nilai numerik sebagai nilai ke dalam dict Python v3.6 + built-in, sekarang harus menghormati urutan memasukkan.
Jika mengatakan dua ekspresi tabel kolom yang dihasilkan dari permintaan database seperti:
SELECT a_key, a_value FROM a_table ORDER BY a_value;
akan disimpan dalam dua Python tuple, k_seq dan v_seq (disejajarkan dengan indeks numerik dan dengan panjang yang sama tentu saja), kemudian:
k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))
Izinkan untuk keluaran nanti sebagai:
for k, v in ordered_map.items():
print(k, v)
menghasilkan dalam hal ini (untuk Python 3.6+ built-in dict baru!):
foo 0
bar 1
baz 42
dalam pemesanan yang sama per nilai v.
Di mana di Python 3.5 instal di mesin saya saat ini menghasilkan:
bar 1
foo 0
baz 42
Detail:
Seperti yang diusulkan pada 2012 oleh Raymond Hettinger (lih. Mail pada python-dev dengan subjek "Kamus yang lebih ringkas dengan iterasi yang lebih cepat" ) dan sekarang (pada 2016) diumumkan dalam email oleh Victor Stinner kepada python-dev dengan subjek "Python 3.6 dict menjadi kompak dan mendapatkan versi pribadi, dan kata kunci menjadi dipesan " karena perbaikan / implementasi masalah 27350 " Compact dan dipesan dict " di Python 3.6 sekarang kita akan dapat, untuk menggunakan dict built-in untuk mempertahankan urutan memasukkan !!
Semoga ini akan mengarah pada implementasi OrderedDict lapisan tipis sebagai langkah pertama. Seperti yang ditunjukkan @ JimFasarakis-Hilliard, beberapa melihat kasus penggunaan untuk tipe OrderedDict juga di masa mendatang. Saya pikir komunitas Python pada umumnya akan memeriksa dengan seksama, apakah ini akan bertahan dalam ujian waktu, dan apa langkah selanjutnya.
Saatnya memikirkan kembali kebiasaan pengkodean kita untuk tidak melewatkan kemungkinan yang dibuka oleh pemesanan stabil:
- Argumen kata kunci dan
- (menengah) penyimpanan dict
Yang pertama karena memudahkan pengiriman dalam implementasi fungsi dan metode dalam beberapa kasus.
Yang kedua karena mendorong untuk lebih mudah menggunakan dict
s sebagai penyimpanan perantara dalam pemrosesan pipa.
Raymond Hettinger dengan baik hati memberikan dokumentasi yang menjelaskan " The Tech Behind Python 3.6 Dictionaries " - dari presentasi San Francisco Python Meetup Group 2016-DEC-08.
Dan mungkin beberapa Stack Overflow halaman pertanyaan dan jawaban yang dihiasi dengan tinggi akan menerima varian informasi ini dan banyak jawaban berkualitas tinggi akan memerlukan pembaruan per versi juga.
Caveat Emptor (tetapi juga lihat pembaruan di bawah 2017-12-15):
Seperti yang dicatat @ajcr dengan benar: "Aspek pelestarian pesanan dari implementasi baru ini dianggap sebagai detail implementasi dan tidak boleh diandalkan." (dari whatsnew36 ) bukan nit picking, tapi kutipannya terpotong agak pesimistis ;-). Ini berlanjut sebagai "(ini dapat berubah di masa depan, tetapi diinginkan untuk memiliki implementasi dict baru ini dalam bahasa untuk beberapa rilis sebelum mengubah spesifikasi bahasa untuk mandat semantik pelestarian pesanan untuk semua implementasi Python saat ini dan 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). "
Jadi seperti dalam beberapa bahasa manusia (misalnya Jerman), penggunaan membentuk bahasa, dan kehendak sekarang telah dinyatakan ... di whatsnew36 .
Pembaruan 2017-12-15:
Dalam surel ke daftar python-dev , Guido van Rossum menyatakan:
Jadikan begitu. "Dict menjaga urutan penyisipan" adalah putusannya. Terima kasih!
Jadi, efek samping versi 3,6 CPython dari pemesanan penyisipan dict sekarang menjadi bagian dari spesifikasi bahasa (dan tidak lagi hanya detail implementasi). Utas surat itu juga memunculkan beberapa tujuan desain yang berbeda untuk collections.OrderedDict
diingatkan oleh Raymond Hettinger selama diskusi.