Python 3.6 itibarıyla yerleşik dict sıralanır
İyi haber, bu nedenle OP'nin anahtarlar olarak benzersiz dize kimlikleri ve yerleşik bir Python v3.6 + dict'e değerler olarak sayısal değerler içeren bir veritabanından alınan eşleme çiftlerinin orijinal kullanım durumu, artık ekleme sırasına uymalıdır.
Bir veritabanı sorgusundan elde edilen iki sütun tablosu ifadesini şöyle söylerseniz:
SELECT a_key, a_value FROM a_table ORDER BY a_value;
k_seq ve v_seq olmak üzere iki Python tuplesinde (sayısal indeks ile hizalanmış ve aynı kurs uzunluğuyla) saklanırsa, o zaman:
k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))
Daha sonra şu şekilde çıktı almanıza izin verin:
for k, v in ordered_map.items():
print(k, v)
bu durumda (yeni Python 3.6+ yerleşik dikte için!):
foo 0
bar 1
baz 42
aynı sırayla
Makinemde Python 3.5 kurulumunda şu anda şunları sağlar:
bar 1
foo 0
baz 42
Detaylar:
2012'de Raymond Hettinger tarafından önerildiği gibi ( "daha hızlı yinelemeli daha kompakt sözlükler" ile python-dev'e cf. postası ) ve şimdi (2016'da) Victor Stinner tarafından "Python 3.6 dict kompakt ve özel bir sürüm alır ve anahtar kelimeler " sorun 27350'nin düzeltilmesi / uygulanması nedeniyle sipariş edilir " Kompakt ve düzenli dikte " Python 3.6 şimdi ekleme siparişi korumak için yerleşik bir dikte kullanmak mümkün olacak!
Umarım bu, ilk adım olarak ince bir katman OrderedDict uygulamasına yol açacaktır. @ JimFasarakis-Hilliard'ın belirttiği gibi, bazıları gelecekte de OrderedDict tipi için kullanım durumlarını görüyor. Bence Python topluluğu, zamanın testine dayanıp dayanamayacağını ve sonraki adımların ne olacağını dikkatlice inceleyecek.
Aşağıdakilerin istikrarlı bir şekilde sıralanmasıyla açılan olasılıkları kaçırmamak için kodlama alışkanlıklarımızı yeniden düşünme zamanı:
- Anahtar kelime bağımsız değişkenleri ve
- (ara) dik depolama
Birincisi, bazı durumlarda işlevlerin ve yöntemlerin uygulanmasında gönderimi kolaylaştırdığı için.
İkincisi, dict
boru hatlarının işlenmesinde ara depo olarak daha kolay kullanılmasını teşvik ettiği için .
Raymond Hettinger , San Francisco Python Meetup Group 2016-DEC-08 sunumundan “ Python 3.6 Sözlüklerinin Arkasındaki Teknoloji ” yi açıklayan belgeler sunmuştur .
Ve belki de oldukça fazla Stack Overflow yüksek süslü soru ve cevap sayfaları bu bilgilerin varyantlarını alacak ve birçok yüksek kaliteli cevap da sürüm başına güncelleme gerektirecektir.
Uyarı Emptor (aynı zamanda aşağıdaki güncelleme 2017-12-15'e bakın):
@Ajcr'ın haklı olarak belirttiği gibi: "Bu yeni uygulamanın siparişi koruyan yönü bir uygulama detayı olarak kabul edilir ve buna güvenilmemelidir." ( whatsnew36'dan ) nit toplama değil, ancak alıntı biraz kötümser ;-) kesildi. Şu şekilde devam ediyor "(bu gelecekte değişebilir, ancak mevcut ve gelecekteki tüm Python uygulamaları için düzeni koruyan anlambilimi zorunlu kılmak için dil spesifikasyonunu değiştirmeden önce bu yeni dict uygulamasının birkaç sürüm için dilde olması arzu edilir; rastgele yineleme sırasının hala geçerli olduğu dilin eski sürümleriyle geriye dönük uyumluluğu korumaya yardımcı olur, örneğin Python 3.5). "
Bazı insan dillerinde (örn. Almanca) olduğu gibi, kullanım dili şekillendirir ve irade şimdi bildirilmiştir ... whatsnew36'da .
2017-12-15 Güncellemesi:
Python-dev listesine bir postada Guido van Rossum şunları söyledi:
Öyleyse yap. "Dict ekleme emrini koruyor" kararıdır. Teşekkürler!
Bu nedenle, dict ekleme siparişinin 3.6 CPython yan etkisi artık dil spesifikasyonunun bir parçası haline geliyor (ve artık sadece bir uygulama detayı değil). Bu posta dizisi, collections.OrderedDict
tartışma sırasında Raymond Hettinger tarafından hatırlatıldığı gibi bazı ayırt edici tasarım hedeflerini de ortaya çıkardı .