2009-04-05 19 views
6

Bunun bir dizi uygulamasını gördüm (ve yazdım). En iyisi kabul edilen mi yoksa standart olarak mı ortaya çıkıyor?Python'da en iyi sipariş edilen dict uygulaması nedir?

Sipariş edilen dict ile kastedilen, nesnenin, PHP'deki bir diziye benzer şekilde, içindeki tuşların sırasına ilişkin bazı kavramlara sahip olmasıdır. PEP 372 , güçlü bir aday gibi görünüyor, ancak kazanan olduğu tamamen belli değil.

+2

-1: "En iyi" tanımsızdır. –

cevap

8

Standart görmedim; Herkes kendi başını döndürüyor gibi görünüyor (bkz. this question). PEP 372'den OrderedDictpatch'u kullanabiliyorsanız, bu en iyi bahistir. Stdlib'de yer alan herhangi bir şey, herkesin bir yıl veya iki yıl sonra kullandığı şey olma şansı çok yüksek.

12

Raymond Hettinger ile gerçekleştirilen bu bir drop-in yerine collections.OrderedDict için Python 2.7 görünecektir geçerli: http://pypi.python.org/pypi/ordereddict

dokümanlar Python 2.7 içinde ne olacağını eşdeğer olduğunu söylemek koleksiyonların dev versiyonu bu yüzden muhtemelen Python ile gelecek olana yumuşak bir geçiş olması oldukça olasıdır.

sen easy_install ordereddict ile yükleyin ve böylece gibi kullanabilirsiniz yüzden PyPI koymak ettik: collections modülünde OrderedDict

from ordereddict import OrderedDict 
d = OrderedDict([("one", 1), ("two", 2)]) 
+0

Raymond Hettinger tarafından verilen emir, koleksiyonlardan daha kısa ve daha zarif görünüyor.OrderedDict. Koleksiyonlarda ne olduğunu düşünüyordum.OrderedDict, Raymond'unkinden daha iyi. Standart paketteki diğer kişi nasıl iyi değil? – FrostNovaZzz

+0

@FrostNovaZzz koleksiyonları.OrderedDict şimdiye kadar çok daha fazla kullanım gördü, bu yüzden "inelegant" farklılıkların aslında hata düzeltmeleri olduğunu umuyorum. – shoyer

1

Python 2.7 ve üstü olması siz düşünmelisiniz böylece, 'standart'. Eğer işlevselliği yeterli ise muhtemelen bunu kullanmalısınız. Bununla birlikte, uygulama yaklaşımı minimalisttir ve bu yeterli değilse, odict, Foord/Larossa veya ordereddict (bana göre) bakmalısınız, çünkü bu durumda daha iyi bir uyum vardır. Her iki uygulama da collections.OrderedDict tarafından sağlanan işlevselliğin bir üst kümesidir. İki varlık arasındaki fark, bu odict, saf python ve ordereddict çok daha hızlı bir C uzantı modülüdür. İhtiyacınız olan tüm işlevleri sağlasa bile minimalist bir yaklaşım mutlaka daha iyi olmayabilir: örn. collections.OrderedDict, başlangıç ​​değerlerinden birinde iç içe olan OrderedDict'un repr()'u döndürürken, başlangıçta bir bug yaptı. Daha önce bulunmuş olabilecek bir hata, alt kümenin, OrderedDict'ın küçük alt kümesinin, eski ordereddict'un kullanılmadığı ispatlandı.

+0

Çalışmanız için teşekkürler, Anthon! Senin emrini almaya çalışıyordum, ama web sitenizdeki zip ve tar arşivleri öldü. Ayrıca, bu projenin hala hayatta olduğundan biraz endişeliyim? Yani, gelecek Python ile güncellenecek mi? Ayrıca, belki pip üzerine koymak onu daha popüler hale getirebilir mi?Web sitenizde 7 kat daha hızlı olduğunu görüyorum, Python geliştiricilerinin bu uygulamayı python'un varsayılanı olarak seçmelerine neden emin olmadığından emin değilim. – jichi

+0

@jichi Ben "orderbictet" (https://bitbucket.org/ruamel/ordereddict) 'a taşınıyorum ve' pip 'ile kurulabilir hale getirme sürecindeyim. Tat'dan sonra Python 3.X uyumluluğuna da bakacağım (belki de, aşağıya doğru bir versiyona dayanarak, koleksiyonlar daha çok collections.OrderedDict gibi). Web sitesindeki bağlantılar tekrar çalışmalıdır. – Anthon

+0

harika, bağlantılar şimdi çalışıyor. işiniz için teşekkürler! – jichi

2

collections.OrderedDict şimdi yaygın olarak bulunmalıdır, ancak eğer performans söz konusuysa, benim paketimi cyordereddict alternatif olarak kullanmayı düşünebilirsiniz. Standart kütüphanenin OrderedDict'dan Cython'a 2-6x daha hızlı olan doğrudan bir portudur.

İlgili konular