2009-04-05 2 views
6

Ich habe eine Reihe von Implementierungen davon gesehen (und geschrieben). Gibt es einen, der als der beste gilt oder als Standard auftaucht?Was ist die beste Diktat-Implementierung in Python?

Was ich mit geordneter dict meine, ist, dass das Objekt ein Konzept der Reihenfolge der Schlüssel in sich hat, ähnlich einem Array in PHP.

odict von PEP 372 scheint wie ein starker Kandidat, aber es ist nicht ganz klar, dass es der Gewinner ist.

+2

-1: "Beste" ist nicht definiert. –

Antwort

8

Ich habe keinen Standard gesehen; Jeder scheint sich selbst zu rollen (siehe Antworten auf this question). Wenn Sie die OrderedDictpatch von PEP 372 verwenden können, ist das Ihre beste Wette. Alles, was in der stdlib enthalten ist, hat eine sehr hohe Chance, das zu sein, was alle in ein oder zwei Jahren verwenden.

12

Dieser von Raymond Hettinger ist eine Drop-in-Ersatz für die collections.OrderedDict, die in Python 2.7 erscheinen: 2.7 http://pypi.python.org/pypi/ordereddict

Die Entwickler-Version der Sammlungen docs sagen, es ist äquivalent zu dem, was wird in Python, Es ist also wahrscheinlich ein reibungsloser Übergang zu dem, der mit Python kommen wird.

Ich habe in PyPI es ausdrückte, so dass Sie es mit easy_install ordereddict installieren können, und verwenden Sie es wie so:

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

das Bestellschreiben von Raymond Hettinger sieht kürzer und eleganter aus als Kollektionen. OrderedDict. Ich dachte was in Sammlungen. OrderedDict ist besser als Raymonds. Wie kommt es, dass der eine im Standardpaket nicht so gut ist wie der andere? – FrostNovaZzz

+0

@FrostNovaZzz collections.OrderedDict hat mittlerweile viel mehr genutzt, also erwarte ich, dass die "uneleganten" Unterschiede eigentlich Bugfixes sind. – shoyer

1

Python 2.7 und später haben OrderedDict im collections Modul, so dass Sie in Betracht ziehen sollten, dass 'Standard'. Wenn seine Funktionalität ausreichend ist, sollten Sie das wahrscheinlich verwenden.

Allerdings ist seine Implementierung Ansatz minimalistisch, und wenn das nicht genug ist, sollten Sie sich odict von Foord/Larossa oder ordereddict (von mir) ansehen, da in diesem Fall diese besser passen. Beide Implementierungen sind eine Obermenge der Funktionalität, die von collections.OrderedDict bereitgestellt wird. Der Unterschied zwischen den beiden ist, dass odict ist reines Python und ordereddict ein viel schneller C Erweiterungsmodul.

Ein minimalistischer Ansatz ist nicht unbedingt besser, auch wenn er alle Funktionen bietet, die Sie benötigen: z. collections.OrderedDict hatte ursprünglich eine bug bei der Rückgabe der repr() eines verschachtelt in einem seiner eigenen Werte. Ein Fehler, der früher gefunden werden konnte, hatte die Teilmenge, die die kleine Teilmenge OrderedDict verarbeiten kann, von Unitests des älteren ordereddict verwendet worden.

+0

danke für deine arbeit, Anthon! Ich habe versucht, Ihre Bestellung zu bekommen, aber sowohl die Zip-und Tear-Archive auf Ihrer Website waren tot. Außerdem bin ich etwas besorgt, ist dieses Projekt noch am Leben? Ich meine, wird es mit zukünftigen Python aktualisiert werden? Vielleicht könnte es auch populärer werden, wenn man es auf den Kopf stellt?Ich sehe 7-mal schneller auf Ihrer Website, nicht sicher, warum Python-Entwickler diese Implementierung nicht als Python-Standard gewählt haben. – jichi

+0

@jichi Ich bin dabei, 'ordereddict' nach [bitbucket] (https://bitbucket.org/ruamel/ordereddict) zu verschieben und installiere es mit' pip'. Danach werde ich auch auf die Kompatibilität mit Python 3.X schauen (vielleicht basierend auf einer abgespeckten Version, mit mehr Funktionalität als collections.OrderedDict). Die Links auf der Website sollten wieder funktionieren. – Anthon

+0

toll, die Links funktionieren jetzt. Danke für deine Arbeit! – jichi

2

collections.OrderedDict sollte jetzt allgemein verfügbar sein, aber wenn die Leistung betrifft, könnten Sie in Betracht ziehen, mein Paket cyordereddict als eine Alternative zu verwenden. Es ist ein direkter Port von OrderedDict der Standard Library nach Cython, der 2-6x schneller ist.