2010-12-20 9 views
11

estoy haciendo diccionario:diccionario en Python con la orden que establece al inicio

d = {"server":"mpilgrim", "database":"master"} 
d['mynewkey'] = 'mynewvalue' 

Pero cuando me exhibo vi que este dict se invierte.

print(d) 

{'mynewkey': 'mynewvalue', 'database': 'master', 'server': 'mpilgrim'} 

¿Cómo revertir?

O si es cierto que el diccionario no se puede ordenar, ¿qué debo usar para tener una colección donde importa el orden de esa información?

Respuesta

17

diccionario no tienen orden (el orden es determinista, sino que depende de un puñado de factores que ni siquiera piensa en y no debe preocuparse - hash de la claves, orden de inserción, colisiones, etc.). En Python 2.7+, use collections.OrderedDict. Si debe usar una versión anterior, hay varias implementaciones que Google puede indicarle.

+0

El ser fácil aplicación una lista de tuplas, especialmente si la velocidad no es un problema. – katrielalex

+0

Sí, eso es más fácil, pero funciona * horriblemente *. Especialmente cuando se usa con algoritmos que suponen "real" (es decir, 'O (1)' leer/escribir/'en') dicts – delnan

1

Su diccionario no ha sido revertido. Está ordenado en parte de acuerdo con el hash de tus llaves. No puede cambiar este orden (no sin usar un diccionario personalizado). En Python 2.7 o posterior, puede usar un diccionario ordenado (collections.OrderedDict).

En versiones anteriores puede usar el siguiente recipe.

también echar un vistazo a esta pregunta: What is the best ordered dict implementation in python?

17
from collections import OrderedDict 

d = OrderedDict() 
d["server"] = "mpilgrim" 
d["database"] = "master" 
d['mynewkey'] = 'mynewvalue' 

print(d) 

OrderedDict([('server', 'mpilgrim'), ('database', 'master'), ('mynewkey', 'mynewvalue')]) 
+0

No, no está bien, porque al inicio" servidor ":" mpilgrim "fue el primero. Ahora es el segundo – user278618

+0

Correcto, arreglé la inserción de la llave una vez que lo noté. Para 'OrderedDicts', necesita agregar claves usando el operador [] (' __setitem__'). El orden de inserción se conserva. – Aphex

3

Si está utilizando Python 3.6 diccionarios están ahora clasificadas por orden de inserción

https://www.python.org/dev/peps/pep-0468/

De lo contrario (como otras personas han dicho) recomendaría collections.OrderedDict

Cuestiones relacionadas