¿Cuál es la forma correcta de inicializar un diccionario ordenado (OD) para que conserve el orden de los datos iniciales?
from collections import OrderedDict
# Obviously wrong because regular dict loses order
d = OrderedDict({'b':2, 'a':1})
# An OD is represented by a list of tuples, so would this work?
d = OrderedDict([('b',2), ('a', 1)])
# What about using a list comprehension, will 'd' preserve the order of 'l'
l = ['b', 'a', 'c', 'aa']
d = OrderedDict([(i,i) for i in l])
Pregunta:
¿Se
OrderedDict
preservará el orden de una lista de tuplas, o una tupla de tuplas o una tupla de listas o una lista de listas, etc., aprobadas en el momento de la inicialización (segundo y tercer ejemplo anteriores)?¿Cómo se verifica si
OrderedDict
realmente se mantiene un orden? Como adict
tiene un orden impredecible, ¿qué sucede si mis vectores de prueba tienen el mismo orden inicial que el orden impredecible de un dict? Por ejemplo, si en lugar ded = OrderedDict({'b':2, 'a':1})
escribird = OrderedDict({'a':1, 'b':2})
, puedo concluir erróneamente que se conserva el orden. En este caso, descubrí que adict
está ordenado alfabéticamente, pero eso puede no ser siempre cierto. ¿Cuál es una forma confiable de usar un contraejemplo para verificar si una estructura de datos conserva el orden o no, a menos que intente probar vectores repetidamente hasta que uno se rompa?
PD: solo dejaré esto aquí como referencia : "El constructor OrderedDict y el método update () aceptan argumentos de palabras clave, pero su orden se pierde porque la función de Python llama a la semántica los argumentos de palabras clave de paso usando un diccionario regular sin ordenar"
PPS: Con suerte, en el futuro, OrderedDict también preservará el orden de los kwargs (ejemplo 1): http://bugs.python.org/issue16991
fuente
OrderDict(b=2, a=1)
también es una forma adecuada. Ver PEP 468 .Respuestas:
El OrderedDict conservará cualquier pedido al que tenga acceso. La única forma de pasarle los datos ordenados para que se inicialice es pasar una lista (o, más generalmente, una iterable) de pares clave-valor, como en los últimos dos ejemplos. Como dice la documentación a la que se vinculó, OrderedDict no tiene acceso a ningún orden cuando pasa argumentos de palabras clave o un argumento dict, ya que cualquier orden allí se elimina antes de que el constructor OrderedDict lo vea.
Tenga en cuenta que usar una lista de comprensión en su último ejemplo no cambia nada. No hay diferencia entre
OrderedDict([(i,i) for i in l])
yOrderedDict([('b', 'b'), ('a', 'a'), ('c', 'c'), ('aa', 'aa')])
. La comprensión de la lista se evalúa y crea la lista y se pasa; OrderedDict no sabe nada sobre cómo se creó.fuente
Sí, eso funcionará. Por definición, una lista siempre se ordena de la forma en que se representa. Esto también se aplica a la comprensión de la lista, la lista generada es de la misma manera que se proporcionaron los datos (es decir, la fuente de una lista será determinista, se obtendrá de una fuente
set
odict
no tanto).Mantiene su lista de fuentes de 2 tuplas como referencia y la usa como datos de prueba para sus casos de prueba cuando realiza pruebas unitarias. Iterar a través de ellos y asegurar que se mantenga el orden.
fuente
__hash__
. Específicamente sobre elstr
tipo.OrderedDict
para no tener la sobrecarga de convertir una lista a unOrderedDict
. Simplemente recorro los elementos como una lista en lugar de un diccionario.