Desde Python 3.6 en adelante, el dict
tipo estándar mantiene el orden de inserción por defecto.
Definiendo
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
dará como resultado un diccionario con las claves en el orden indicado en el código fuente.
Esto se logró mediante el uso de una matriz simple con enteros para la tabla hash dispersa, donde esos enteros se indexan en otra matriz que almacena los pares clave-valor (más el hash calculado). Esa última matriz simplemente almacena los elementos en orden de inserción, y toda la combinación en realidad usa menos memoria que la implementación utilizada en Python 3.5 y anteriores. Vea la idea original publicada por Raymond Hettinger para más detalles.
En 3.6 esto todavía se consideraba un detalle de implementación; ver el Novedades de Python 3.6 documentación :
El aspecto de preservación del orden de esta nueva implementación se considera un detalle de implementación y no se debe confiar en él (esto puede cambiar en el futuro, pero se desea tener esta nueva implementación dict en el idioma durante algunas versiones antes de cambiar la especificación del idioma para ordenar la semántica de preservación del orden para todas las implementaciones actuales y futuras de Python; esto también ayuda a preservar la compatibilidad con versiones anteriores del lenguaje donde el orden de iteración aleatoria aún está vigente, por ejemplo, Python 3.5).
Python 3.7 eleva este detalle de implementación a una especificación de lenguaje , por lo que ahora es obligatorio que dict
conserve el orden en todas las implementaciones de Python compatibles con esa versión o más nuevas. Ver el pronunciamiento de la BDFL .
Es posible que aún desee utilizar la collections.OrderedDict()
clase en ciertos casos, ya que ofrece algunas funcionalidades adicionales además del dict
tipo estándar . Como ser reversible (esto se extiende a los objetos de vista ) y admitir la reordenación (a través del move_to_end()
método ).
dict()
documentación incluso incluye un ejemplo.contiene
Si los valores son
True
(o cualquier otro objeto inmutable), también puede usar:fuente
OrderedDict(FUTURE=[], TODAY=[], PAST=[])
no funcionarán, cuando se menciona un enfoque:OrderedDict([('FUTURE', []), ('TODAY', []), ('PAST', [])])
mantendrán el orden.En lugar de explicar la parte teórica, daré un ejemplo simple.
fuente
OrderedDict
de hecho resuelve el problema, pero ... en este ejemplo en particular obtienes exactamente el mismo resultado usando un diccionario estándar{'aol': 1, 'foo': 3}
así que creo que es un buen ejemplo ilustrativo.OrderedDict.update()
con un iterables pares de valores clave que contienen:d1.upate([(key1, val1), (key2, val2)])
.Tenga en cuenta que esta respuesta se aplica a las versiones de python anteriores a python3.7. CPython 3.6 mantiene el orden de inserción en la mayoría de las circunstancias como un detalle de implementación. A partir de Python3.7 en adelante, se ha declarado que las implementaciones DEBEN mantener el orden de inserción para cumplir.
los diccionarios de python no están ordenados. Si desea un diccionario ordenado, intente colecciones.OrderedDict .
Tenga en cuenta que OrderedDict se introdujo en la biblioteca estándar en python 2.7. Si tiene una versión anterior de python, puede encontrar recetas para diccionarios ordenados en ActiveState .
fuente
Los diccionarios usarán un orden que hace que la búsqueda sea eficiente, y no puede cambiar eso,
Simplemente puede usar una lista de objetos (una tupla de 2 elementos en un caso simple, o incluso una clase), y agregar elementos al final. Luego puede usar la búsqueda lineal para buscar elementos en ella.
Alternativamente, podría crear o utilizar una estructura de datos diferente creada con la intención de mantener el orden.
fuente
Encontré esta publicación mientras intentaba descubrir cómo hacer que OrderedDict funcione. PyDev para Eclipse no pudo encontrar OrderedDict en absoluto, así que decidí hacer una tupla de los valores clave de mi diccionario, ya que me gustaría que se ordenaran. Cuando necesitaba generar mi lista, simplemente iteraba a través de los valores de la tupla y conectaba la 'clave' iterada de la tupla al diccionario para recuperar mis valores en el orden en que los necesitaba.
ejemplo:
Es un poco engorroso, pero estoy presionado por el tiempo y es la solución que se me ocurrió.
nota: el enfoque de la lista de listas que alguien más sugirió realmente no tiene sentido para mí, porque las listas están ordenadas e indexadas (y también tienen una estructura diferente a la de los diccionarios).
fuente
Realmente no puedes hacer lo que quieres con un diccionario. Ya tienes el diccionario
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
creado. Descubrí que no había forma de mantener el orden una vez que ya estaba creado. Lo que hice fue crear un archivo json con el objeto:Solía:
luego utilizado:
para verificar.
fuente
fuente
Otra alternativa es usar Pandas,
dataframe
ya que garantiza el orden y las ubicaciones de índice de los elementos en una estructura tipo dict.fuente
En general, se puede diseñar una clase que se comporta como un diccionario, principalmente la aplicación de los métodos
__contains__
,__getitem__
,__delitem__
,__setitem__
y algunos más. Esa clase puede tener cualquier comportamiento que desee, por ejemplo, dividir un iterador ordenado sobre las teclas ...fuente
si desea tener un diccionario en un orden específico, también puede crear una lista de listas, donde el primer elemento será la clave, y el segundo elemento será el valor y se verá como este ejemplo
fuente
Tuve un problema similar al desarrollar un proyecto Django. No podía usar OrderedDict, porque estaba ejecutando una versión antigua de python, por lo que la solución era usar la clase SortedDict de Django:
https://code.djangoproject.com/wiki/SortedDict
p.ej,
Nota: Esta respuesta es originalmente de 2011. Si tiene acceso a Python versión 2.7 o superior, entonces debería tener acceso al estándar ahora
collections.OrderedDict
, del cual muchos ejemplos han sido proporcionados por otros en este hilo.fuente
Puedes hacer lo mismo que hice para el diccionario.
Crea una lista y un diccionario vacío:
fuente