2009-02-08 11 views
42

Este es el diccionario que tengo¿Por qué Python está ordenando mi diccionario como tal?

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", 
} 

Pero cuando lo imprimo con "\ n" .join (myDict) me sale este

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

Sé que un diccionario no está ordenado pero sale lo mismo cada vez y no tengo idea de por qué.

+36

desordenada significa orden es ninguno de su negocio . NO significa que el orden sea inconsistente. –

+1

@S. Lott: Precisamente. Eso es lo que me enseñaron en mi curso de CS: 'las colecciones desordenadas siempre tendrán algún orden, * desordenado * significa que no debemos confiar en él' – Abgan

+5

más preciso: el orden de los diccionarios de Python es arbitrario pero determinista (según la especificación de Python). Donde determinista significa que siempre se comportará de la misma manera. –

Respuesta

79

La verdadera pregunta debería ser "¿por qué no?" ... un diccionario desordenado es probablemente implementado como hash table (de hecho, el Python documentation lo declara) donde el orden de los elementos está bien definido pero no es obvio. Sus observaciones coinciden perfectamente con las reglas de una tabla hash: aparentemente arbitraria, pero con un orden constante.

+1

Vale la pena leer un comentario del archivo fuente de python ; Ya lo publiqué en una publicación de stackoverflow sobre "el mejor comentario que has visto": http://is.gd/iSyN – llimllib

+1

Puedes encontrar un poco de la implementación interna de dict aquí http: //www.laurentluce. com/posts/python-dictionary-implementation /. Hubo una buena presentación de uno de los codificadores de Python, pero no puedo encontrarla en este momento (creo que fue de PyCon Australia). –

10

El specification para el diccionario de tipo incorporado declina toda conservación del orden, es mejor pensar en un diccionario como un conjunto desordenado de pares es key: value ...

es posible que desee comprobar la OrderedDict module, que es una implementación de un diccionario ordenado con Key Insertion Order.

8

Lo único que puede confiar en pedidos del diccionario es que el pedido seguirá siendo el mismo si no hay modificaciones en el diccionario; por ejemplo, repetir dos veces un diccionario sin modificarlo dará como resultado la misma secuencia de claves. Sin embargo, aunque el orden de los diccionarios de Python es determinista, puede estar influenciada por factores tales como el orden de las inserciones y eliminaciones, por lo que la igualdad de diccionarios puede terminar con diferentes ordenamientos:

>>> {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}) 
Cuestiones relacionadas