¿Es posible recuperar elementos de un diccionario de Python en el orden en que se insertaron?¿Cómo recuperas elementos de un diccionario en el orden en que se insertan?
Respuesta
La python estándar dict
no puede hacer esto.
Hay una propuesta (PEP 372) para agregar un "diccionario ordenado" (que realiza un seguimiento del orden de inserción) al módulo collections
en la biblioteca estándar. Incluye enlaces a variousimplementationsofordereddictionaries (vea también estos tworecipes en el Cookbook de Python).
Es posible que desee seguir con la implementación de referencia en el PEP si desea que su código sea compatible con la versión "oficial" (si finalmente se acepta la propuesta).
EDITAR: El PEP fue aceptado y agregado en python 2.7 y 3.1. Ver the docs.
No se puede hacer esto con la clase base dict - se ordena con hash. Puede construir su propio diccionario que sea realmente una lista de pares clave, de valor o somesuch, que se ordenarían.
La implementación del diccionario puede utilizar un diccionario estándar y una lista, el diccionario almacena la clave-> valor asociaciones, y la lista almacena claves en el orden en que y están insertados. –
Las otras respuestas son correctas; no es posible, pero podrías escribir esto tú mismo. Sin embargo, en caso de que no esté seguro de cómo implementar realmente algo como esto, aquí hay una implementación completa y funcional que subclasifica el dict que acabo de escribir y probar. (Tenga en cuenta que el orden de los valores pasados al constructor no está definido, pero vendrá antes de valores pasados más tarde, y siempre se puede simplemente no permite predice la orden de ser inicializado con los valores.)
class ordered_dict(dict):
def __init__(self, *args, **kwargs):
dict.__init__(self, *args, **kwargs)
self._order = self.keys()
def __setitem__(self, key, value):
dict.__setitem__(self, key, value)
if key in self._order:
self._order.remove(key)
self._order.append(key)
def __delitem__(self, key):
dict.__delitem__(self, key)
self._order.remove(key)
def order(self):
return self._order[:]
def ordered_items(self):
return [(key,self[key]) for key in self._order]
od = ordered_dict()
od["hello"] = "world"
od["goodbye"] = "cruel world"
print od.order() # prints ['hello', 'goodbye']
del od["hello"]
od["monty"] = "python"
print od.order() # prints ['goodbye', 'monty']
od["hello"] = "kitty"
print od.order() # prints ['goodbye', 'monty', 'hello']
print od.ordered_items()
# prints [('goodbye','cruel world'), ('monty','python'), ('hello','kitty')]
¿Ordene correctamente order_dict (('key_a', 'value_a'), ('key_b', 'value_b'))? Parece que el orden se establecerá en self.keys() en __init__, que se ordena en el orden de hash, no en el orden en que se ingresó? Sólo curioso. –
Está en lo correcto, por lo que dije: "el orden de los valores pasados al constructor no está definido, pero vendrá antes de que los valores pasen luego". Sería posible ordenarlos adecuadamente, pero no estaba seguro de si ese era un comportamiento deseado, ya que podría decirse que dichos objetos se insertan simultáneamente. –
si no es necesario la funcionalidad dict, y solo necesita devolver tuplas en el orden en que las insertó, ¿no funcionaría mejor una cola?
He usado StableDict antes con éxito.
O, simplemente, hacer que la llave con una tupla time.now() como el primer campo de la tupla.
Luego puede recuperar las claves con dictname.keys(), sort y ¡voila!
Gerry
Esto hace que sea imposible buscar entradas en el diccionario sin saber exactamente cuándo las insertó. No es mejor que una lista de pares clave-valor. – user2357112
No es posible a menos que almacenar las claves en una lista separada para hacer referencia más adelante.
O utilice cualquiera de las implementaciones para el PEP-372 descrito here, como el odict module del pythonutils.
He utilizado con éxito el pocoo.aplicación org, es tan fácil como la sustitución de su
my_dict={}
my_dict["foo"]="bar"
con
my_dict=odict.odict()
my_dict["foo"]="bar"
y requieren solo this file
Lo que puede hacer es insertar los valores con una clave que representa la orden introducida, y luego llame al sorted()
en los artículos.
>>> obj = {}
>>> obj[1] = 'Bob'
>>> obj[2] = 'Sally'
>>> obj[3] = 'Joe'
>>> for k, v in sorted(obj.items()):
... print v
...
Bob
Sally
Joe
>>>
Si no necesitáramos la clave para otros fines, usaríamos una lista. Esto no hace nada, una lista no funciona mejor. – user2357112
@ user2357112, sin embargo, esto expresa otro método de hacer ** lo que pidió el OP **. El OP no preguntó cómo imprimir los artículos en el orden en que se insertaron, el OP dijo cómo imprimir los artículos ** en un 'dict' **. Gran diferencia. –
Has cambiado el formato de la dicción hasta el punto de hacerla inútil para el propósito original. Si originalmente el dict estaba asociando, por ejemplo, nombres a números de teléfono, ha ganado un orden de iteración constante, pero no tiene idea de cuál es el número de teléfono de Bob. – user2357112
Uso OrderedDict(), disponible desde la versión 2.7
Sólo es cuestión de curiosidad:
from collections import OrderedDict
a = {}
b = OrderedDict()
c = OredredDict()
a['key1'] = 'value1'
a['key2'] = 'value2'
b['key1'] = 'value1'
b['key2'] = 'value2'
c['key2'] = 'value2'
c['key1'] = 'value1'
print a == b #True
print a == C#True
print b == C#False
- 1. Mantener un árbol binario equilibrado cuando los elementos se insertan en orden
- 2. El orden de los elementos en el diccionario
- 3. C#: ordenar el diccionario en orden descendente
- 4. Cómo cambiar el orden de los elementos en un dijit.form.Select
- 5. ¿Cómo se insertan XML en un nodo XML existente
- 6. Cómo agregar elementos a una matriz (que es un elemento en el diccionario (elemento) en plist)?
- 7. Pasar por Elementos de formulario en el orden en que se agregaron
- 8. diccionario en Python con la orden que establece al inicio
- 9. ListView de QML: ¿Cómo deshabilitar el desplazamiento automático cuando se insertan nuevos elementos?
- 10. entradas de diccionario Almacenamiento Python en el orden en que son empujados
- 11. MongoDB: Cómo pedir una "seleccione en" en el mismo orden que los elementos de la matriz
- 12. ¿Cómo se clona un diccionario en .NET?
- 13. ¿Cómo contar todos los elementos en un diccionario anidado?
- 14. orden de las claves en el diccionario de Python
- 15. ¿Cómo puedo especificar el orden en que se ejecutan before_filters?
- 16. ¿Cómo garantizar que se conserve el orden especificado en TestNG.xml?
- 17. Cuando recorro un diccionario (estructura de datos genérica .NET) ¿estará en el mismo orden en que los agregué?
- 18. Cuenta de Python de elementos en un diccionario de listas
- 19. ¿El orden de los elementos en el conjunto jQuery ajustado siempre coincide con el orden en que aparecen los elementos en el marcado?
- 20. ¿Se garantiza que el orden de las claves() y values () en el diccionario python será el mismo?
- 21. ¿Cómo se puede hacer una secuencia de elementos opcionales que deben estar en orden en un esquema XML?
- 22. ¿Cómo recuperas el texto seleccionado usando Regex en C#?
- 23. Orden de enumeración del diccionario
- 24. stack.ToList() en .NET - orden de los elementos?
- 25. Invertir orden de un conjunto de elementos
- 26. SQL Server se muestran los elementos en orden específico
- 27. Arreglo allKeys de NSDictionary en mal estado, ¿no en el orden en que están en el diccionario?
- 28. Un tipo de diccionario con un orden definido de claves
- 29. En Python, ¿cómo puede recuperar fácilmente elementos ordenados de un diccionario?
- 30. ¿Cómo escribo los métodos que insertan ejemplos de rspec?
posible duplicado de [¿Por qué los valores del diccionario no están en el orden insertado?] (http://stackoverflow.com/questions/6061380/why-dictionary-values-arent-in-the-inserted-order) – nbro