Si tengo un diccionario en Python, y lo repito una vez, y luego otra vez más tarde, ¿está garantizado el orden de iteración porque no inserté, eliminé ni actualicé ningún elemento en el diccionario? (Pero podría haber hecho búsquedas).¿Los diccionarios conservan el orden de iteración si no se modifican?
Respuesta
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.
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'!
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
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. –
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
Puede conservarse en algunas implementaciones, pero no cuente con él, ya que no forma parte de la especificación Dict.
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. –
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.
Sí. No hay aleatorización involucrada. Hay una garantía aún más fuerte: consulte here.
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
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. –
@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. –
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.
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
sí, esta sería la manera correcta de hacerlo – Claudiu
@Claudiu: No has tenido tiempo para explicar qué es el "eso" que quieres hacer. –
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.
- 1. Iteración sobre la lista de diccionarios
- 2. Orden de iteración de HashSet
- 3. ¿Los navegadores conservan el orden de las entradas con el mismo nombre en GET/POST?
- 4. ¿Cómo se modifican los datos de la aplicación Rails?
- 5. ¿Cómo hacer que la tarea personalizada evite rehacer el trabajo si los archivos de entrada no se modifican?
- 6. Establecer el orden de iteración varía de ejecución a ejecución
- 7. Codificación de cadena de tipos primitivos que conservan el orden lexicográfico
- 8. Orden de iteración de conjuntos en Python
- 9. Los archivos de recursos se modifican cuando se abre el formulario en Visual Studio
- 10. ¿Cómo se personalizan/modifican los errores de codeigniter?
- 11. ¿El mismo orden de iteración en Map.keySet y Map.values?
- 12. Eliminar elementos de la lista de repetición que conservan el orden de aparición
- 13. Al hacer un .replaceWith() en jQuery no se conservan los enlaces de eventos
- 14. ¡No se pueden recuperar los miembros enum en el orden en que se han definido!
- 15. En LINQ, ¿las proyecciones de un IOrderedEnumerable <T> conservan el orden?
- 16. ¿Los servidores proxy HTTP modifican los paquetes de solicitud?
- 17. ¿Cómo se conservan los comentarios condicionales en el elemento <html> en un tema Diazo?
- 18. ¿Qué anotaciones de Scala modifican los mensajes del compilador?
- 19. iteración orden de bucles for..in en Javascript
- 20. Diccionarios diccionarios
- 21. ¿Cómo actualizar las entidades que se modifican fuera de DbContext?
- 22. ¿Comprende la lista Python para diccionarios en los diccionarios?
- 23. Python: cómo saber si dos diccionarios tienen las mismas claves
- 24. Diccionarios Concatenación
- 25. ¿Iterar sobre los diccionarios VBA?
- 26. ¿Cómo dividir un repositorio de git mientras se conservan los subdirectorios?
- 27. ¿Qué ocurre si NSMutableArray se modifica mediante varios subprocesos al mismo tiempo? (si los objetos que contiene se conservan en otro lugar)
- 28. Cómo administrar dependencias externas que se modifican constantemente
- 29. ¿Cómo se establece el orden de los mensajes de validación?
- 30. Cómo probar campos privados que se modifican mediante métodos públicos
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. –
esto realmente responde la pregunta, por lo que debería ser la respuesta = P. Tendayi sigue siendo útil aunque – Claudiu