web-dev-qa-db-fra.com

Pourquoi python commande mon dictionnaire comme ça?

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 il sort toujours à chaque fois et je ne sais pas pourquoi.

41
Teifion

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

Python a depuis changé son implémentation dict pour conserver 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ée dans son la mise en oeuvre).

79
Konrad Rudolph

Le 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 voudrez peut-être vérifier le module OrderedDict , qui est une implémentation d'un dictionnaire ordonné avec l'ordre d'insertion des clés.

10
CMS

La seule chose à propos de la commande de dictionnaire sur laquelle vous pouvez compter est que la commande restera la même s'il n'y a pas de modifications dans le dictionnaire; Par exemple, itérer deux fois sur un dictionnaire sans le modifier entraînera la même séquence de touches. 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, donc des dictionnaires égaux peuvent se retrouver avec des ordonnances différentes:

>>> {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})
8
Miles