2009-05-14 6 views
1

Lorsque vous appelez dict.values ​​(), l'ordre des éléments renvoyés dépend de la valeur has des clés. Cela semble être très cohérent dans toutes les versions de cPython, cependant le manuel python pour dict simply states that the ordering is "arbitrary". Je me souviens d'avoir lu quelque part qu'il existe réellement un PEP qui spécifie spécifiquement l'ordre attendu des méthodes items() et values ​​().Quel PEP gouverne l'ordre de dict.values ​​()?

FYI, si ce comportement est en effet un comportement garanti d'une classe sur laquelle je travaille, je pourrais grandement simplifier et accélérer une classe sur laquelle je travaille. D'un autre côté, s'il s'agit simplement d'une caractéristique accidentelle et non documentée de cPython, il est probablement préférable de ne pas lui faire confiance.

Répondre

6

Je suppose que PEP-3106 est aussi proche qu'il obtient:

La spécification implique que l'ordre dans lequel les articles sont retournés par .keys(), .values ​​() et .items() est le même (comme dans Python 2.x), parce que la commande est tous dérivé de l'itérateur dict (qui est vraisemblablement arbitraire mais stable tant qu'un dict n'est pas modifié). Cela peut être exprimé par l' invariant suivant:

list(d.items()) == list(zip(d.keys(), d.values()))

+0

Notez que l'ordre sera conforme pour un dict donné (jusqu'à ce dict est modifié) sur une version Python donnée, sur une plate-forme donnée. Ainsi, vous pouvez compter sur une dict donnée en restant ordonnée de la même manière dans une seule instance de votre code de fonctionnement, mais pas au-delà. Bien sûr, il est préférable de ne jamais se fier à quelque chose lié à la commande d'un dict. –

7

De http://docs.python.org/library/stdtypes.html:

clés et les valeurs sont répertoriées dans un ordre arbitraire qui est non aléatoire, varie selon les implémentations de Python, et dépend de l'histoire des insertions et des suppressions du dictionnaire.

2

"arbitraire" n'est pas la même chose que "accidentel".

Mais c'est la même chose que "non documenté". Puisque le dictionnaire est basé sur des hachages, vous ne pouvez pas vraiment garantir l'ordre basé sur l'algorithme de hachage et les collisions qui se produisent.

Pour garantir une commande, vous utilisez la fonction sorted.

Ou vous pouvez trouver une bonne implémentation ordered dictionary que vous souhaitez utiliser à la place d'un dict.