Ab dem Python 3.6 das eingebaute Diktat wird bestellt
Gute Nachrichten, so dass die OP's ursprünglichen Anwendungsfall der Zuordnung Paare aus einer Datenbank mit eindeutigen String-IDs als Schlüssel und numerische Werte als Werte in einem eingebauten Python v3.6+ Diktat abgerufen, sollte nun die Einfügereihenfolge zu respektieren.
Wenn zum Beispiel die resultierenden zweispaltigen Tabellenausdrücke aus einer Datenbankabfrage wie:
SELECT a_key, a_value FROM a_table ORDER BY a_value;
in zwei Python-Tupeln, k_seq und v_seq (natürlich nach numerischem Index ausgerichtet und mit gleicher Länge), gespeichert werden würde:
k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))
Später ausgeben lassen als:
for k, v in ordered_map.items():
print(k, v)
in diesem Fall (für das neue in Python 3.6+ eingebaute Diktat!):
foo 0
bar 1
baz 42
in der gleichen Reihenfolge pro Wert von v.
Wo in der Python 3.5-Installation auf meinem Rechner ergibt es derzeit:
bar 1
foo 0
baz 42
Einzelheiten:
Wie 2012 von Raymond Hettinger vorgeschlagen (vgl. Mail auf python-dev mit Betreff "Kompaktere Wörterbücher mit schnellerer Iteration" ) und nun (im Jahr 2016) in einer Mail von Victor Stinner an python-dev mit dem Betreff "Python 3.6 dict wird kompakt und bekommt eine private Version; und Schlüsselwörter werden geordnet" aufgrund der Behebung/Umsetzung von Problem 27350 "Kompaktes und geordnetes Diktat" in Python 3.6 werden wir nun in der Lage sein, ein eingebautes Diktat zu verwenden, um die Einfügereihenfolge beizubehalten!!
Hoffentlich wird dies in einem ersten Schritt zu einer dünnschichtigen OrderedDict-Implementierung führen. Wie @JimFasarakis-Hilliard andeutete, sehen einige auch in Zukunft Anwendungsfälle für den OrderedDict-Typ. Ich denke, die Python-Gemeinschaft insgesamt wird sorgfältig prüfen, ob dies den Test der Zeit bestehen wird und was die nächsten Schritte sein werden.
Es ist an der Zeit, unsere Kodierungsgewohnheiten zu überdenken, um die Möglichkeiten nicht zu verpassen, die sich durch die stabile Anordnung von eröffnen:
- Schlüsselwortargumente und
- (Zwischen-)Lagerung von Diktaten
Erstens, weil es die Abfertigung bei der Implementierung von Funktionen und Methoden in einigen Fällen erleichtert.
Die zweite, weil sie dazu anregt, leichter die dict
s als Zwischenspeicher in Verarbeitungspipelines.
Raymond Hettinger hat freundlicherweise eine Dokumentation zur Verfügung gestellt, die erklärt " Die Technik hinter den Python 3.6-Wörterbüchern " - aus seiner Präsentation der San Francisco Python Meetup Group 2016-DEC-08.
Und vielleicht werden einige hochdekorierte Frage- und Antwortseiten von Stack Overflow Varianten dieser Informationen erhalten und viele hochqualitative Antworten werden ebenfalls ein Update pro Version erfordern.
Caveat Emptor (siehe aber auch unten Update 2017-12-15):
Wie @ajcr zu Recht anmerkt: "Der ordnungserhaltende Aspekt dieser neuen Implementierung ist ein Implementierungsdetail und sollte nicht als verlässlich angesehen werden." (aus der whatsnew36 ) keine Erbsenzählerei, sondern das Zitat wurde ein wenig pessimistisch geschnitten ;-). Weiter heißt es: "(Dies kann sich in der Zukunft ändern, aber es ist erwünscht, diese neue dict-Implementierung in der Sprache für ein paar Versionen zu haben, bevor die Sprachspezifikation geändert wird, um eine ordnungserhaltende Semantik für alle aktuellen und zukünftigen Python-Implementierungen vorzuschreiben; dies hilft auch, die Rückwärtskompatibilität mit älteren Versionen der Sprache zu bewahren, in denen die zufällige Iterationsreihenfolge noch in Kraft ist, z.B. Python 3.5)."
Wie in einigen menschlichen Sprachen (z.B. Deutsch) prägt also der Sprachgebrauch die Sprache, und der Wille ist nun erklärt worden ... in whatsnew36 .
Update 2017-12-15:
In einem Mail an die python-dev-Liste erklärte Guido van Rossum:
Machen Sie es so. "Dict behält die Einfügereihenfolge bei" ist die Regel. Danke!
Der CPython-Seiteneffekt der Diktateinfüge-Reihenfolge in Version 3.6 wird nun also Teil der Sprachspezifikation (und nicht mehr nur ein Implementierungsdetail). Dieser Mail-Thread hat auch einige besondere Design-Ziele für collections.OrderedDict
wie von Raymond Hettinger in der Diskussion angemahnt.