42 votes

Pourquoi python ordonne-t-il mon dictionnaire de cette manière ?

Voici le dictionnaire que j'ai

propertyList = {
    "id":           "int",
    "name":         "char(40)",

    "team":         "int",
    "realOwner":    "int",

    "x":            "int",
    "y":            "int",

    "description":  "char(255)",

    "port":         "bool",
    "secret":       "bool",
    "dead":         "bool",
    "nomadic":      "bool",

    "population":   "int",
    "slaves":       "int",
}

Mais quand je l'imprime avec " \n ".join(myDict) J'obtiens ceci

name
nomadic
dead
port
realOwner
secret
slaves
team
y
x
population
id
description

Je sais qu'un dictionnaire n'est pas ordonné mais le résultat est le même à chaque fois et je ne sais pas pourquoi.

38 votes

Sans ordre signifie que l'ordre ne vous regarde pas. Cela ne signifie PAS que l'ordre est incohérent.

1 votes

@S. Lott : Précisément. C'est ce qu'on m'a enseigné dans mon cours d'informatique : " les collections non ordonnées auront toujours un certain ordre ", non ordonné signifie que nous ne devons pas nous y fier

2 votes

Mais si vous êtes intéressé par l'ordre, ce n'est pas la structure de données que vous devriez rechercher. Un dictionnaire est une collection d'éléments non ordonnée. Les listes et les tuples préservent l'ordre.

79voto

Konrad Rudolph Points 231505

Pour les anciennes versions de Python, la vraie question devrait être "pourquoi pas ?". - Un dictionnaire non ordonné est généralement implémenté en tant que table de hachage où l'ordre des éléments est bien défini mais pas immédiatement évident ( la documentation Python indiquait ceci ). Vos observations correspondent parfaitement aux règles d'une table de hachage : ordre apparent arbitraire, mais constant.

Depuis, Python a modifié son dict pour préserver l'ordre d'insertion, et c'est garanti à partir de Python 3.7 . L'implémentation ne constitue donc plus une table de hachage pure (mais une table de hachage est toujours utilisé dans sa mise en œuvre).

1 votes

Cela vaut la peine de lire un commentaire du fichier source du dictionnaire de python ; je l'ai déjà posté dans un post de stackoverflow sur "le meilleur commentaire que vous ayez jamais vu" : is.gd/iSyN

1 votes

Une partie de l'implémentation interne de dict peut être trouvée ici laurentluce.com/posts/python-dictionary-implementation . Il y avait une belle présentation d'un des codeurs de python, mais je ne peux pas la trouver pour le moment (je pense que c'était de PyCon Australie).

10voto

CMS Points 315406

Le site spécification pour le type de dictionnaire intégré rejette toute préservation de l'ordre, il est préférable de considérer un dictionnaire comme un ensemble non ordonné de key: value paires...

Vous pouvez vérifier le OrderedDict module qui est une implémentation d'un dictionnaire ordonné avec ordre d'insertion des clés.

8voto

Miles Points 12977

La seule chose à laquelle on peut se fier concernant l'ordre des dictionnaires, c'est que l'ordre restera le même si aucune modification n'est apportée au dictionnaire ; par exemple, en itérant deux fois sur un dictionnaire sans le modifier, on obtiendra la même séquence de clés. Cependant, bien que l'ordre des dictionnaires Python soit déterministe, il peut être influencé par des facteurs tels que l'ordre des insertions et des suppressions, de sorte que des dictionnaires identiques peuvent se retrouver avec des ordres différents :

>>> {1: 0, 2: 0}, {2: 0, 1: 0}
({1: 0, 2: 0}, {1: 0, 2: 0})
>>> {1: 0, 9: 0}, {9: 0, 1: 0}
({1: 0, 9: 0}, {9: 0, 1: 0})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X