Depuis Python 3.6 le dict intégré sera commandé
Bonne nouvelle, le cas d'utilisation d'origine de l'OP de mappage de paires récupérées dans une base de données avec des ID de chaîne uniques en tant que clés et des valeurs numériques en tant que valeurs dans un dict Python v3.6 + intégré devrait désormais respecter l'ordre d'insertion.
Si, par exemple, les expressions de table à deux colonnes résultant d'une requête de base de données:
SELECT a_key, a_value FROM a_table ORDER BY a_value;
serait stocké dans deux tuples Python, k_seq et v_seq (alignés par index numérique et avec la même longueur bien sûr), puis:
k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))
Autoriser à sortir plus tard en tant que:
for k, v in ordered_map.items():
print(k, v)
donnant dans ce cas (pour le nouveau dict intégré Python 3.6+!):
foo 0
bar 1
baz 42
dans le même ordre par valeur de v.
Où dans l'installation Python 3.5 sur ma machine, il donne actuellement:
bar 1
foo 0
baz 42
Détails:
Comme proposé en 2012 par Raymond Hettinger (cf. mail sur python-dev avec le sujet "Dictionnaires plus compacts avec une itération plus rapide" ) et maintenant (en 2016) annoncé dans un mail de Victor Stinner à python-dev avec le sujet "Python 3.6 dict devient compact et obtient une version privée, et les mots clés deviennent ordonnés "en raison de la correction / implémentation du problème 27350 " Compact et ordonné dict " dans Python 3.6, nous allons maintenant pouvoir utiliser un dict intégré pour maintenir l'ordre d'insertion !!
Espérons que cela conduira à une implémentation OrderedDict en couche mince dans un premier temps. Comme l'a indiqué @ JimFasarakis-Hilliard, certains verront également des cas d'utilisation pour le type OrderedDict à l'avenir. Je pense que la communauté Python dans son ensemble inspectera attentivement si cela résistera à l'épreuve du temps et quelles seront les prochaines étapes.
Il est temps de repenser nos habitudes de codage pour ne pas rater les possibilités ouvertes par une commande stable de:
- Arguments de mots clés et
- (intermédiaire) stockage de dict
Le premier parce qu'il facilite la répartition dans l'implémentation des fonctions et méthodes dans certains cas.
La seconde car elle encourage à utiliser plus facilement dict
s comme stockage intermédiaire dans les pipelines de traitement.
Raymond Hettinger a aimablement fourni de la documentation expliquant " The Tech Behind Python 3.6 Dictionaries " - de sa présentation du San Francisco Python Meetup Group 2016-DEC-08.
Et peut-être que certaines pages de questions et réponses décorées de Stack Overflow recevront des variantes de ces informations et de nombreuses réponses de haute qualité nécessiteront également une mise à jour par version.
Caveat Emptor (mais voir également la mise à jour ci-dessous 2017-12-15):
Comme le note @ajcr à juste titre: "L'aspect préservant l'ordre de cette nouvelle implémentation est considéré comme un détail d'implémentation et ne doit pas être invoqué." (à partir du whatsnew36 ) pas de cueillette, mais la citation a été coupée un peu pessimiste ;-). Il continue comme "(cela peut changer à l'avenir, mais il est souhaitable d'avoir cette nouvelle implémentation de dict dans le langage pour quelques versions avant de changer la spécification du langage pour rendre obligatoire la sémantique préservant l'ordre pour toutes les implémentations Python actuelles et futures; cela aussi aide à préserver la compatibilité descendante avec les anciennes versions du langage où l'ordre d'itération aléatoire est toujours en vigueur, par exemple Python 3.5). "
Ainsi, comme dans certaines langues humaines (par exemple l'allemand), l'usage façonne la langue, et la volonté a maintenant été déclarée ... dans whatsnew36 .
Mise à jour 2017-12-15:
Dans un mail à la liste python-dev , Guido van Rossum a déclaré:
Faire en sorte. "Dict conserve l'ordre d'insertion" est la décision. Merci!
Ainsi, l'effet secondaire CPython de la version 3.6 de l'ordre d'insertion de dict fait maintenant partie de la spécification de langage (et non plus seulement un détail d'implémentation). Ce fil de discussion a également fait ressortir certains objectifs de conception distinctifs, collections.OrderedDict
comme l'a rappelé Raymond Hettinger lors de la discussion.