2010-10-20 5 views
12

J'ai un dictionnaire. Les clés sont des dates (datetime). J'ai besoin de trier le dictionnaire de sorte que les valeurs dans le dictionnaire sont triées par date - de sorte qu'en itérant dans le dictionnaire, je traite les éléments dans l'ordre chronologique désiré (c'est-à-dire date/heure). Comment puis-je trier un tel dictionnaire par date?Tri d'un dictionnaire (avec des clés de date) en Python

Exemple:

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

Note: J'utilise des cordes ici au lieu de datetime, pour garder l'exemple simple

+2

tri devrait fonctionner au format aaaa-mm-jj comme des chaînes aussi. –

+0

Glad quelqu'un déjà demandé cela;) – PeterM

Répondre

2

Les dictionnaires sont être triée. Itérer sur sorted(mydict.keys()) à la place.

+3

il est possible de dire aussi «trié (mydict)» si vous préférez. –

+0

À droite, je n'oublie pas cela ... –

+1

ou 'trié (mydict.items())' –

0

Je suis sûr que python sait comment comparer les dates. Alors:

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

Python compare les objets 'datetime' sans aucun problème. Dans ce cas, les chaînes «YYYY-MM-DD» sont également correctement comparables. Un problème serait la date au format «MM/JJ/AAAA» ou «JJ.MM.AAAA», mais pas avec «AAAA-MM-JJ». – eumiro

+2

Les trois dernières lignes de votre code peuvent également être écrites comme 'return [valeur pour clé, valeur dans triée (adict.items())]' – eumiro

0

depuis vos chaînes de date semblent être dans un format approprié, vous pouvez simplement faire:

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

dictionnaires jamais stocker quoi que ce soit dans un certain ordre. Mais vous pouvez obtenir une liste de clés en utilisant d.keys() qui pourrait être triée. Itérer sur un générateur comme ci-dessous.

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

En utilisant ceci, vous pourrez parcourir les valeurs dans l'ordre chronologique.

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

vous n'avez pas besoin de '.keys()' là – SilentGhost

+0

@SilentGhost: oh Ouais! Voilà. –

16

Si vous utilisez Python 2.7+ ou 3.1+ vous pouvez créer un OrderedDict from collections d'une sorte de votre dictionnaire, puis itérer cela.

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

Cependant, en fonction de ce que vous voulez faire est probablement plus facile à itérer sur une liste triée des clés de votre dict.

+1

Quoi de mieux que de créer un 'OrderedDict' ou de récupérer, puis de trier les clés après que des modifications ont été apportées au dictionnaire, serait un [SortedDict] (http://pypi.python.org/pypi/sorteddict). – martineau

+0

Pourquoi les gens persistent à utiliser 'key' quand ils veulent juste l'ordre de tri naturel? –

+0

Pour les débutants Python comme moi, @martineau signifiait que vous pouvez atteindre le même objectif comme ceci 'ordered = OrderedDict (trié (mydict.items()) ' Notez que le tri fonctionne de la même manière si les clés sont des objets datetime réels et non des chaînes – jbustamovej

0

Python 2.7 (publié le 3 Juillet 2010) prend en charge un type dictionnaire ordonné:

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

+0

dictionnaire ordonné se souvient de l'ordre d'insertion. Mais le module de blist a trié http://pypi.python.org/pypi/blist/ –

+0

mais le dictionnaire d'ordre n'a-t-il pas aussi une fonction de "tri"? –

+0

Si vous le dites de cette façon, oui. Et puis il resterait pour un usage futur. Plus naturel pour moi serait de trier. –

Questions connexes