2009-12-04 8 views

Respuesta

31

Esto es lo que dict.items()documentation dice:

dict.items() devuelven una copia de la lista del diccionario de pares (clave, valor).

Si los elementos(), keys(), values ​​(), iteritems(), iterkeys(), e itervalues ​​() son llamados sin modificaciones intermedias al diccionario, las listas se corresponderán directamente.

Creo que es razonable suponer que el orden de los elementos no cambiará si todo lo que haces es iteración.

+9

No hay necesidad de suponer: la documentación le dice explícitamente que el pedido no cambiará si todo lo que hace es la interacción. –

+0

esto realmente responde la pregunta, por lo que debería ser la respuesta = P. Tendayi sigue siendo útil aunque – Claudiu

2

Un diccionario de Python no tiene ningún concepto de orden. Entonces no puedes depender de un orden específico mientras iteras.

Esto es deliberado: dado que es un hashmap, ¡es inevitable si desea 'búsquedas rápidas'!

+1

cierto, pero hay algún orden subyacente que obtienes al llamar a .iterkeys() o .itervalues ​​(). Mi pregunta es: ¿se conservará esto si el dict no se modifica? – Claudiu

+0

Eso depende de la implementación, pero no se hace tal garantía. Parece que, en efecto, CPython siempre (basado en observaciones pasadas y _muy_ pruebas limitadas) devuelve las claves/valores/ítems en el mismo orden. Si necesita que se le garantice el pedido, solo use una implementación de OrderedDict, de la que puede encontrar muchos en la naturaleza. –

+0

Responderá básicamente MCCutchen: use un OrderedDict si desea confiar en un pedido mientras itera un dict, no puede contar con él en un dict estándar. – ChristopheD

2

Puede conservarse en algunas implementaciones, pero no cuente con él, ya que no forma parte de la especificación Dict.

+1

Si sigues el enlace a la especificación Dict.en la respuesta de John Machin, verá que la especificación Dict garantiza que el orden de iteración no cambiará si no modifica los contenidos. Con lo que no puede contar es que el orden será coherente entre las implementaciones. –

1

Como dijo Christophe, se usa un diccionario para organizar pares clave/valor debido al tiempo de acceso rápido que proporciona. Si su aplicación necesita un índice fijo, debe mirar las otras estructuras de datos que proporcionan un orden específico/conocido.

Una vez dicho esto, debe ser seguro asumir que el orden no cambia a menos que se añaden elementos (no habría ningún punto de hacerlo caro funcionamiento de la reorganización de la materia), etc, pero, de nuevo, no lo hacen confía en eso.

5

Sí. No hay aleatorización involucrada. Hay una garantía aún más fuerte: consulte here.

+0

No downvoting, pero de su enlace: 'orden arbitraria que es .../snip/varía en las implementaciones de Python,' Si desea que su código sea portable, no confíe en un pedido de dict. ¿Qué sucede si cambian la implementación de dict en la próxima implementación de CPython? – ChristopheD

+0

Como escribí en mi respuesta, * esto es específico de la implementación *. otras implementaciones pueden no garantizar esto. entonces, si utiliza esta propiedad, en realidad está renunciando a la portabilidad. –

+1

@Ofri Raviv: Todo lo que está preguntando es si obtendrá el mismo resultado si 'teclea some_dict' dos veces si no perturba el dict mientras tanto. Esta es una garantía simple. Si no fuera así, la garantía más compleja entregada en los documentos a los que me vinculé no sería posible. –

12

La versión estándar de Python dict, como la mayoría de las implementaciones, no conserva el orden, ya que a los elementos generalmente se accede con la tecla.

Sin embargo, la iteración predecible es alguna vez útil y en Python 3.1 el módulo collections contiene un OrderedDict que preserva el orden con una sobrecarga de rendimiento mínima.

+0

Esta es probablemente la mejor, más segura y la solución que cumple con las normas para las personas preocupadas por mantener el orden en un 'dict'. ¡Cinco altos! – jathanism

+0

sí, esta sería la manera correcta de hacerlo – Claudiu

+0

@Claudiu: No has tenido tiempo para explicar qué es el "eso" que quieres hacer. –

4

collections.OrderedDict estará disponible en Python 2.7 además de Python 3.1.

Para las versiones de Python anteriores a la 2.7, hay collective.ordereddict en PyPI, y Django tiene su propia implementación SortedDict.

Cuestiones relacionadas