valor resueltos recorrer que lista elementos ejercicios ejemplo diccionarios diccionario convertir buscar agregar python dictionary

resueltos - que es un diccionario en python



¿Cómo recuperas elementos de un diccionario en el orden en que se insertan? (10)

He usado StableDict antes con éxito.

ordered

¿Es posible recuperar elementos de un diccionario de Python en el orden en que se insertaron?


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 que los valores pasados ​​posteriormente, y siempre podría no permitir que los dicts ordenados se inicialicen con 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'')]


Lo que puede hacer es insertar los valores con una clave que representa el orden ingresado, y luego llamar a sorted() en los ítems.

>>> obj = {} >>> obj[1] = ''Bob'' >>> obj[2] = ''Sally'' >>> obj[3] = ''Joe'' >>> for k, v in sorted(obj.items()): ... print v ... Bob Sally Joe >>>


No es posible a menos que almacene las claves en una lista separada para hacer referencia posteriormente.


No puedes hacer esto con la clase dict base: está ordenada por hash. Puede construir su propio diccionario que sea realmente una lista de pares clave, de valor o somesuch, que se ordenarían.


O bien, simplemente convierta la clave en una tupla con time.now () como el primer campo de la tupla.

Luego puede recuperar las claves con dictname.keys (), sort y ¡voila!

Gerry


O use cualquiera de las implementaciones para el PEP-372 que se describe here , como el módulo odict de pythonutils .

Utilicé con éxito la implementación de pocoo.org, es tan fácil como reemplazar su

my_dict={} my_dict["foo"]="bar"

con

my_dict=odict.odict() my_dict["foo"]="bar"

y requiere solo este archivo


Utilice OrderedDict (), disponible desde la versión 2.7

Solo una 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


si no necesita la funcionalidad dict, y solo necesita devolver tuplas en el orden en que las insertó, ¿no funcionaría mejor una cola?


El dict estándar de Python no puede hacer esto.

Existe una propuesta ( PEP 372 ) para agregar un "diccionario ordenado" (que realiza un seguimiento del orden de inserción) al módulo de collections en la biblioteca estándar. Incluye enlaces a various implementations of dictionaries ordered (ver también estas two recipes en el Python Cookbook).

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 los documentos .