2010-10-20 23 views
12

Tengo un diccionario. Las claves son fechas (fecha y hora). Necesito ordenar el diccionario para que los valores en el diccionario estén ordenados por fecha, de modo que al iterar por el diccionario, estoy procesando los elementos en el orden cronológico deseado (es decir, fecha/hora).Ordenar un diccionario (con las teclas de fecha) en Python

¿Cómo puedo ordenar un diccionario por fecha?

Ejemplo:

mydict = { '2000-01-01': {fld_1: 1, fld_2: 42}, '2000-01-02': {fld_1:23, fld_2: 22.17} } 

Nota: Estoy usando cuerdas aquí en lugar de fecha y hora, para mantener el ejemplo sencillo

+2

clasificación debería funcionar en el formato aaaa-mm-dd como cadenas también. –

+0

Me alegro de que alguien ya haya preguntado esto;) – PeterM

Respuesta

2

diccionarios son unsortable. Iterar más de sorted(mydict.keys()) en su lugar.

+3

es posible decir también 'sorted (mydict)' si lo prefiere. –

+0

Correcto, sigo olvidándome de eso ... –

+1

or 'ordenado (mydict.items())' –

0

Estoy seguro de que python sabe cómo comparar las fechas. Por lo tanto:

def sortedDictValues(adict): 
items = adict.items() 
items.sort() 
return [value for key, value in items] 
+0

Python compara objetos 'datetime' sin ningún problema. En este caso, las cadenas 'YYYY-MM-DD' también son correctamente comparables. Un problema sería la fecha en el formato 'MM/DD/YYYY' o' DD.MM.YYYY', pero no con 'YYYY-MM-DD'. – eumiro

+2

Las últimas tres líneas de su código también se pueden escribir como 'return [value for key, value in sorted (adict.items())]' – eumiro

0

ya que sus cadenas de fecha parecen estar en un formato adecuado que sólo podría hacer:

>>> sorted(mydict.items())   # iteritems in py2k 
[('2000-01-01', {'fld_2': 42, 'fld_1': 1}), ('2000-01-02', {'fld_2': 22.17, 'fld_1': 23})] 
5

Diccionarios Nunca guarde nada en algún orden. Pero puede obtener una lista de claves usando d.keys() que podría ser ordenada. Iteramos sobre un generador como a continuación.

def sortdict(d): 
    for key in sorted(d): yield d[key] 

Utilizándolo, podrá repetir los valores en orden cronológico.

for value in sortdict(mydict): 
    # your code 
    pass 
+0

no necesita '.keys()' there – SilentGhost

+0

@SilentGhost: oh ¡sí! ahí tienes. –

16

Si está utilizando Python 2.7+ 3.1+ o puede crear una OrderedDict from collections de una especie de su diccionario y luego iterar a través de eso.

ordered = OrderedDict(sorted(mydict.items(), key=lambda t: t[0])) 

Sin embargo, dependiendo de lo que quieres hacer es probable que sea más fácil para iterar sobre una lista ordenada de las claves de su dict.

+1

Lo que podría ser incluso mejor que crear un 'OrderedDict' o recuperar y luego ordenar las claves después de realizar cualquier cambio en el diccionario, sería un [SortedDict] (http://pypi.python.org/pypi/sorteddict). – martineau

+0

¿Por qué las personas persisten en usar 'clave' cuando solo quieren el orden natural? –

+0

Para principiantes de Python como yo, @martineau significaba que puedes lograr el mismo objetivo como este 'ordered = OrderedDict (sorted (mydict.items()) ' Tenga en cuenta que el orden funciona igual si las claves son objetos datetime reales y no cadenas – jbustamovej

0

Python 2.7 (liberada el 3 de julio de 2010) es compatible con un tipo de diccionario ordenada:

http://www.python.org/download/releases/2.7/

+0

diccionario ordenado recuerda el orden de inserción. Pero el módulo blist tiene sorteddict http://pypi.python.org/pypi/blist/ –

+0

, pero ¿el diccionario de órdenes tampoco tiene una función de "ordenar"? –

+0

Si lo pones de esa manera, sí. Y luego permanecería para uso futuro. Más natural para mí sería sorteddict. –

Cuestiones relacionadas