2009-12-09 9 views
17

Fellows:entradas de diccionario Almacenamiento Python en el orden en que son empujados

diccionario

A Python se almacena en ningún orden en particular (asignaciones tienen ningún orden), por ejemplo,

>>> myDict = {'first':'uno','second':'dos','third':'tres'} 
myDict = {'first':'uno','second':'dos','third':'tres'} 
>>> myDict 
myDict 
{'second': 'dos', 'third': 'tres', 'first': 'uno'} 

Si bien es posible recuperar una lista ordenada o tupla de un diccionario, me pregunto si es posible hacer que un diccionario almacene los elementos en el orden en que se le pasan, en el ejemplo anterior esto significaría tener el orden interno como {'first':'uno','second':'dos','third':'tres'} y no diferente.

Lo necesito porque estoy usando el diccionario para almacenar los valores a medida que los leo desde un archivo de configuración; una vez leídos y procesados ​​(los valores son alterados), deben escribirse en un nuevo archivo de configuración en el mismo orden en que fueron leídos (este orden no es alfabético ni numérico).

¿Alguna idea?

Editar: Tenga en cuenta que yo no estoy buscando formas secundarias para recuperar el orden (como las listas), pero de maneras de hacer un diccionario pueden pedir en sí mismo (como lo será en las próximas versiones de Python) .

+2

http://stackoverflow.com/questions/1867861/python-dictionary-keep-keys-values-in-same-order-as-declared –

+0

@ Ofri Raviv: exactamente la misma pregunta. Gracias. – Escualo

+1

Como intenta mantener el orden, en realidad no es un diccionario en primer lugar. Estás haciendo demasiadas cosas. Es posible que desee tanto el diccionario (para el mapeo) como la lista (para conservar el orden). Nada de malo con eso. –

Respuesta

30

Try Python 2.7 y superior, probablemente, 3.1, hay OrderedDict

http://www.python.org/

http://python.org/download/releases/2.7/

>>> from collections import OrderedDict 
>>> d = OrderedDict([('first', 1), ('second', 2), 
...     ('third', 3)]) 
>>> d.items() 
[('first', 1), ('second', 2), ('third', 3)] 

PEP 372: Adding an ordered dictionary to collections

+0

Nice. Pero tenga en cuenta que es una nueva característica de una próxima versión de Python y no está disponible en versiones anteriores. – akr

+0

... pero Estoy atascado con 2.5.1 :( – Escualo

+3

O consiga el código fuente de OrderedDict de este parche: http://bugs.python.org/issue5397 –

4

Utilice una lista para mantener el orden de la clave

+0

rápido y sucio. por desgracia, no es muy compacto (puede volverse frágil). –

+0

Esto funciona, pero estoy buscando una forma más "natural", si es que hay una. Parece que el OrderedDict sugerido por S.Mark es la alternativa que estaba buscando. Desafortunadamente estoy atascado con Python 2.5.1 :( – Escualo

+1

No si encapsulas el dict y la lista en un solo objeto con la interfaz dict. Lo que, por cierto, es lo que hacen muchas implementaciones de Dict ordenadas (no sé sobre la implementación en realidad) adoptado en 2.7) –

1

Diccionarios en Python se implementan como tablas hash, por lo que el orden sea aleatorio. Podría implementar su propia variación de un dict de esa clase, pero perdería la sintaxis conveniente. En su lugar, realice un seguimiento del orden de las teclas, también.

inicialización:

keys = [] 
myDict = {} 

Mientras que la lectura:

myDict[key] = value 
keys.append(key) 

Mientras que la escritura:

for key in keys: 
    print key, myDict[key] 
+0

Mis llaves no están en orden alfabético o numérico :(Pueden ser cualquier cosa. – Escualo

+0

No necesita perder ninguna sintaxis. Simplemente implemente métodos especiales como __get __() y __set __() etc. uso de sintaxis como dict ['key'] y dict ['key1'] = newvalue. – Isaac

3

Las implementaciones de los diccionarios orden de preservación sin duda existen.

Hay this one in Django, confusamente llamado SortedDict, que funcionará en Python> = 2.3 iirc.

+0

Acabo de notar que esto va a estar en desuso en Django 1.9. – imns

-2

Hay una respuesta muy corta para que .. hacer esto-

dictCopy = yourdictname.copy()

continuación, utilizar el dictCopy, será en el mismo orden.

+0

Los diccionarios en Python no tienen orden, por lo tanto la pregunta. – Escualo

1

En lugar de explicar la parte teórica daré un ejemplo simple.

>>> from collections import OrderedDict 
>>> my_dictionary=OrderedDict() 
>>> my_dictionary['foo']=3 
>>> my_dictionar['aol']=1 
>>> my_dictionary 
OrderedDict([('foo', 3), ('aol', 1)]) 
Cuestiones relacionadas