Il semble que les listes renvoyées par keys()
et les values()
méthodes d'un dictionnaire soient toujours un mappage 1 à 1 (en supposant que le dictionnaire n'est pas modifié entre l'appel des 2 méthodes).
Par exemple:
>>> d = {'one':1, 'two': 2, 'three': 3}
>>> k, v = d.keys(), d.values()
>>> for i in range(len(k)):
print d[k[i]] == v[i]
True
True
True
Si vous ne modifiez pas le dictionnaire entre appel keys()
et appel values()
, est-il erroné de supposer que la boucle for ci-dessus affichera toujours True? Je n'ai trouvé aucune documentation confirmant cela.
Réponses:
Trouvé ceci:
Sur la documentation 2.x et documentation 3.x .
la source
Oui, ce que vous avez observé est en effet une propriété garantie - les touches (), les valeurs () et les éléments () renvoient des listes dans un ordre congru si le dict n'est pas modifié. iterkeys () & c itère également dans le même ordre que les listes correspondantes.
la source
dataframe
propose une alternative où les éléments peuvent être mis à jour ou supprimés, et l'ordre et les emplacements d'index des éléments dans une structure de type dict restent fixes.Oui, il est garanti en python 2.x :
la source
Oui. À partir de CPython 3.6, les dictionnaires renvoient les éléments dans l'ordre dans lequel vous les avez insérés .
Ignorez la partie qui dit que c'est un détail d'implémentation. Ce comportement est garanti dans CPython 3.6 et est requis pour toutes les autres implémentations Python commençant par Python 3.7 .
la source
Bonnes références aux documents. Voici comment vous pouvez garantir la commande indépendamment de la documentation / mise en œuvre:
la source
Selon http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects , les méthodes keys (), values () et items () d'un dict renverront les itérateurs correspondants dont les ordres correspondre. Cependant, je suis incapable de trouver une référence à la documentation officielle de python 2.x pour la même chose.
Donc pour autant que je sache, la réponse est oui, mais uniquement en python 3.0+
la source
Pour ce que ça vaut, un code de production utilisé lourd que j'ai écrit est basé sur cette hypothèse et je n'ai jamais eu de problème avec cela. Je sais que cela ne le rend pas vrai cependant :-)
Si vous ne voulez pas prendre le risque, j'utiliserais iteritems () si vous le pouvez.
la source
Je n'étais pas satisfait de ces réponses car je voulais m'assurer que les valeurs exportées avaient le même ordre, même lors de l'utilisation de différents dictés.
Ici, vous spécifiez l'ordre des clés à l'avance, les valeurs renvoyées auront toujours le même ordre même si le dict change, ou si vous utilisez un dict différent.
la source