Ab Python 3.6 wird das eingebaute Diktat bestellt
Gute Nachrichten, daher sollte der ursprüngliche Anwendungsfall des OP für die Zuordnung von Paaren, die aus einer Datenbank mit eindeutigen Zeichenfolgen-IDs als Schlüssel und numerischen Werten als Werte in einem integrierten Python v3.6 + -Dikt abgerufen wurden, jetzt die Einfügereihenfolge berücksichtigen.
Wenn Sie sagen, die resultierenden zwei Spaltentabellenausdrücke aus einer Datenbankabfrage wie:
SELECT a_key, a_value FROM a_table ORDER BY a_value;
würde in zwei Python-Tupeln gespeichert werden, k_seq und v_seq (ausgerichtet durch numerischen Index und natürlich mit der gleichen Länge), dann:
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)
Nachgeben in diesem Fall (für das neue integrierte Python 3.6+ Diktat!):
foo 0
bar 1
baz 42
in der gleichen Reihenfolge pro Wert von v.
Wo in der Python 3.5-Installation auf meinem Computer derzeit Folgendes angezeigt wird:
bar 1
foo 0
baz 42
Einzelheiten:
Wie 2012 von Raymond Hettinger vorgeschlagen (vgl. Mail zu Python-Dev mit dem Betreff "Kompaktere Wörterbücher mit schnellerer Iteration" ) und jetzt (2016) in einer Mail von Victor Stinner an Python-Dev mit Betreff "Python 3.6 dict wird kompakt und erhält eine private Version; und Schlüsselwörter werden " aufgrund der Korrektur / Implementierung des Problems 27350 " Kompaktes und geordnetes Diktat " in Python 3.6 geordnet. Wir können jetzt ein eingebautes Diktat verwenden, um die Einfügereihenfolge aufrechtzuerhalten !!
Hoffentlich führt dies als ersten Schritt zu einer dünnen OrderedDict-Implementierung. Wie @ JimFasarakis-Hilliard angedeutet hat, sehen einige auch in Zukunft Anwendungsfälle für den OrderedDict-Typ. Ich denke, die Python-Community im Allgemeinen wird sorgfältig prüfen, ob dies den Test der Zeit bestehen wird und wie die nächsten Schritte aussehen werden.
Zeit, unsere Codierungsgewohnheiten zu überdenken, um die Möglichkeiten nicht zu verpassen, die sich aus einer stabilen Reihenfolge von:
- Schlüsselwortargumente und
- (Zwischen-) Diktspeicherung
Das erste, weil es in einigen Fällen den Versand bei der Implementierung von Funktionen und Methoden erleichtert.
Das zweite, da es dazu anregt, dict
s leichter als Zwischenspeicher in Verarbeitungspipelines zu verwenden.
Raymond Hettinger stellte freundlicherweise eine Dokumentation zur Verfügung, in der " The Tech Behind Python 3.6 Dictionaries " erläutert wurde - aus seiner Präsentation der San Francisco Python Meetup Group 2016-DEC-08.
Und vielleicht erhalten einige hochdekorierte Fragen- und Antwortseiten mit Stapelüberlauf Varianten dieser Informationen, und viele qualitativ hochwertige Antworten erfordern auch ein Update pro Version.
Vorbehalt Emptor (siehe aber auch unten Update 2017-12-15):
Wie @ajcr zu Recht bemerkt: "Der auftragserhaltende Aspekt dieser neuen Implementierung wird als Implementierungsdetail betrachtet und sollte nicht als verlässlich angesehen werden." (aus dem whatsnew36 ) nicht nit picking, aber das zitat wurde etwas pessimistisch geschnitten ;-). Es wird fortgesetzt als "(dies kann sich in Zukunft ändern, es ist jedoch erwünscht, diese neue Dikt-Implementierung für einige Releases in der Sprache zu haben, bevor die Sprachspezifikation geändert wird, um eine auftragserhaltende Semantik für alle aktuellen und zukünftigen Python-Implementierungen vorzuschreiben; dies auch hilft dabei, die Abwärtskompatibilität mit älteren Versionen der Sprache zu erhalten, in denen die zufällige Iterationsreihenfolge noch gültig ist, z. B. Python 3.5). "
Wie in einigen menschlichen Sprachen (z. B. Deutsch) prägt der Gebrauch die Sprache, und der Wille wurde jetzt erklärt ... in whatsnew36 .
Update 15.12.2017:
In einer Mail an die Python-Entwicklerliste erklärte Guido van Rossum:
Mach es so. "Dikt hält Einfügereihenfolge" ist das Urteil. Vielen Dank!
Der CPython-Nebeneffekt der Diktateinfügungsreihenfolge in Version 3.6 wird nun Teil der Sprachspezifikation (und nicht mehr nur ein Implementierungsdetail). Dieser Mail-Thread tauchte auch einige markante Designziele auf collections.OrderedDict
, an die Raymond Hettinger während der Diskussion erinnerte.