views:

67

answers:

6

I have a dictionary. The keys are dates (datetime). I need to sort the dictionary so that the values in the dictionary are sorted by date - so that by iterating through the dictionary, I am processing items in the desired chronological (i.e. date/time) order.

How may I sort such a dictionary by date?

Example:

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

Note: I am using strings here instead of datetime, to keep the example simple

+2  A: 

Dictionaries are unsortable. Iterate over sorted(mydict.keys()) instead.

Ignacio Vazquez-Abrams
it is possible also say `sorted(mydict)` if you prefer.
Tony Veijalainen
Right, I keep forgetting about that...
Ignacio Vazquez-Abrams
or `sorted(mydict.items())`
gnibbler
A: 

I'm sure that python knows how to compare dates. So:

def sortedDictValues(adict):
 items = adict.items()
 items.sort()
 return [value for key, value in items]
foret
Python compares `datetime` objects without any problems. In this case `YYYY-MM-DD` strings are also correctly comparable. A problem would be date in format `MM/DD/YYYY` or `DD.MM.YYYY`, but not with `YYYY-MM-DD`.
eumiro
The last three lines of your code can be also written as `return [value for key, value in sorted(adict.items())]`
eumiro
A: 

since your date strings seem to be in a proper format you could just do:

>>> 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})]
SilentGhost
+3  A: 

Dictionaries never store anything in some order. But you can get a list of keys using d.keys() which could be sorted. Iterate over a generator like below.

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

Using this you will be able to iterate over values in chronological order.

for value in sortdict(mydict):
    # your code
    pass
Ashish
you don't need `.keys()` there
SilentGhost
@SilentGhost: oh yeah! there you go.
Ashish
+3  A: 

If you're using Python 2.7+ or 3.1+ you could create an OrderedDict from collections from a sort of your dictionary and then iterate through that.

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

However, depending on what you want to do it's probably easier to iterate over a sorted list of keys from your dict.

Dave Webb
What might be even better than creating an `OrderedDict` or retrieving and then sorting the keys after any changes are made to the dictionary, would be a [SortedDict](http://pypi.python.org/pypi/sorteddict).
martineau
A: 

Python 2.7 (released on July 3rd, 2010) supports an ordered dictionary type:

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

Tom Teman
ordered dictionary remembers the order of insertion. But blist module has sorteddict http://pypi.python.org/pypi/blist/
Tony Veijalainen
but doesn't the order dictionary also have a "sort" function?
Tom Teman
If you put it that way, yes. And then it would stay for future use. More natural for me would be to sorteddict.
Tony Veijalainen