2011-05-21 19 views
28

tengo un diccionarioorden de las claves en el diccionario de Python

{'a': 'first', 'b': 'second'} 

Sin embargo, necesito el diccionario en un orden diferente:

{'b': 'second', 'a': 'first'} 

¿Cuál es la mejor manera de hacer esto?

+0

Bien, mi culpa, leeré la documentación. Simplemente lo imprimí y fue por orden específico por casualidad. Pensé que tenía algo que ver con una forma en que está escrito. Al igual que la matriz de php. – Qiao

+0

@Qiao Esta es una buena pregunta. Yo estaba como "oh, eso será fácil de responder con la documentación" - no lo es. Este "hecho trivial" parece ser conocimiento asumido en la mayoría de los lugares. Lo mejor que puedo encontrar (en OrderedDict, capítulo 8.3) es "Un OrderedDict es un dict que recuerda el orden en que se insertaron las claves por primera vez". –

+1

Ahh, ahí está: "Lo mejor es pensar en un diccionario como un conjunto * desordenado de clave: pares de valores, con el requisito de que las claves sean únicas (dentro de un diccionario)". de [5.5 Estructuras de datos en el Tutorial] (http://docs.python.org/tutorial/datastructures.html#dictionaries). –

Respuesta

40

Diccionarios son no ordenados. Entonces no hay forma de hacerlo.

Si tiene python2.7 +, puede utilizar collections.OrderedDict - en este caso, se podría recuperar la lista elemento utilizando .items() y luego invertir y crear un nuevo OrderedDict de la lista invertido:

>>> od = OrderedDict((('a', 'first'), ('b', 'second'))) 
>>> od 
OrderedDict([('a', 'first'), ('b', 'second')]) 
>>> items = od.items() # list(od.items()) in Python3 
>>> items.reverse() 
>>> OrderedDict(items) 
OrderedDict([('b', 'second'), ('a', 'first')]) 

Si está utilizando una versión anterior de python puede obtener un backport de http://code.activestate.com/recipes/576693/

+2

Exactamente, ambos diccionarios en tu ejemplo son equivalentes. – Hyperboreus

+2

Ordenado y ordenado son cosa diferente. 'OrderedDict' no está ordenado, no se puede ordenar manualmente y ninguna estructura de datos en Python es una estructura de datos ordenada (es decir, siempre se ordena automáticamente). –

+0

Eso es lo que quise decir. Aunque edité mi respuesta por claridad. – ThiefMaster

6

Los diccionarios no tienen orden.

Puede obtener las llaves, pedirlas como desee, y luego repetir los valores del diccionario de esa manera.

keys = myDict.keys() 
keys = sorted(keys) # order them in some way 
for k in keys: 
    v = myDict[k] 
+0

Creo que quería 'keys.sort()'. 'sorted()' devuelve una nueva lista pero no modifica el objeto pasado. – ThiefMaster

+0

@theif - tienes razón. Gracias. – eduffy

4

No se puede; dict s son insuperables. Use un OrderedDict si necesita un diccionario ordenado.

Cuestiones relacionadas