Estoy teniendo problemas para usar la collections.OrderedDict
clase. Estoy usando Python 2.7 en Raspbian, la distribución de Debian para Raspberry Pi. Estoy tratando de imprimir dos diccionarios para poder compararlos (lado a lado) para una aventura de texto. El orden es esencial para comparar con precisión. No importa lo que intente, los diccionarios imprimen en su forma desordenada habitual.
Esto es lo que obtengo cuando lo hago en mi RPi:
import collections
ship = {"NAME": "Albatross",
"HP":50,
"BLASTERS":13,
"THRUSTERS":18,
"PRICE":250}
ship = collections.OrderedDict(ship)
print ship
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
Obviamente, hay algo que no está bien porque está imprimiendo la llamada a la función y colocando las claves y los grupos de valores en una lista anidada ...
Esto es lo que obtuve al ejecutar algo similar en mi PC:
import collections
Joe = {"Age": 28, "Race": "Latino", "Job": "Nurse"}
Bob = {"Age": 25, "Race": "White", "Job": "Mechanic", "Random": "stuff"}
#Just for clarity:
Joe = collections.OrderedDict(Joe)
Bob = collections.OrderedDict(Bob)
print Joe
# OrderedDict([('Age', 28), ('Race', 'Latino'), ('Job', 'Nurse')])
print Bob
# OrderedDict([('Age', 25), ('Race', 'White'), ('Job', 'Mechanic'), ('Random', 'stuff')])
Esta vez, está en orden, pero no debería imprimir las otras cosas, ¿verdad? (Ponerlo en la lista y mostrar la llamada a la función).
¿Dónde estoy cometiendo mi error? No debería tener nada que ver con la versión pi de Python porque es solo la versión de Linux.
fuente
OrderedDict
se ordena por orden de inserción, no por orden de teclas alfanuméricas.Respuestas:
Primero está creando un diccionario , luego pasa ese diccionario a un
OrderedDict
. Para las versiones de Python <3.6 (*) , cuando lo haga, el orden ya no será correcto.dict
es inherentemente no ordenadoPase una secuencia de tuplas en su lugar:
Lo que ves cuando imprimes
OrderedDict
es su representación , y es completamente correcto.OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
solo le muestra, en una representación reproducible , cuáles son los contenidos delOrderedDict
.(*) : En la implementación de CPython 3.6, el
dict
tipo se actualizó para usar una estructura interna más eficiente en memoria que tiene el efecto secundario de preservar el orden de inserción, y por extensión, el código que se muestra en la pregunta funciona sin problemas. A partir de Python 3.7, la especificación del lenguaje Python se ha actualizado para requerir que todas las implementaciones de Python sigan este comportamiento. Vea esta otra respuesta mía para obtener más detalles y también por qué es posible que aún desee usar unOrderedDict()
para ciertos casos.fuente
print ship
?? Gracias :)OrderedDict
se crea , es un diccionario.Si no puede editar esta parte del código donde se definió su dict, puede solicitarlo en cualquier momento de la forma que desee, de esta manera:
fuente
La mayoría de las veces vamos a OrderedDict cuando requerimos un pedido personalizado, no uno genérico como ASC, etc.
Aquí está la solución propuesta:
Esto se generará:
Nota : Los nuevos diccionarios ordenados mantienen su orden cuando se eliminan las entradas. Pero cuando se agregan nuevas claves, las claves se agregan hasta el final y el orden no se mantiene ( documento oficial )
fuente
Use dict.items (); puede ser tan simple como lo siguiente:
fuente