2010-10-20 16 views
12

Mam słownik. Klucze są datami (datetime). Potrzebuję posortować słownik, aby wartości w słowniku były posortowane według daty - tak, że poprzez iterację przez słownik, przetwarzam elementy w pożądanej kolejności chronologicznej (tj. Data/godzina).Sortowanie słownika (z kluczami daty) w Pythonie

Jak mogę posortować taki słownik według daty?

Przykład:

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

Uwaga: Używam tutaj zamiast datetime struny, aby utrzymać przykład prosty

+2

sortowania powinny działać w formacie rrrr-mm-dd jako ciągi również. –

+0

Cieszę się, że ktoś już o to prosił;) – PeterM

Odpowiedz

2

Słowniki są unsortable. Iteruj zamiast sorted(mydict.keys()).

+3

możliwe jest również powiedzenie "posortowane (mydict)", jeśli wolisz. –

+0

Dobrze, ciągle zapominam o tym ... –

+1

lub "posortowane (mydict.items())' –

0

Jestem pewien, że pyton wie, jak porównać daty. Więc:

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

Python porównuje obiekty 'datetime' bez żadnych problemów. W tym przypadku łańcuchy "RRRR-MM-DD" również są poprawnie porównywalne. Problemem będzie data w formacie "MM/DD/RRRR" lub "DD.MM.RRRR", ale nie z "RRRR-MM-DD". – eumiro

+2

Ostatnie trzy linie twojego kodu mogą być również zapisane jako 'return [wartość klucza, wartość w posortowanej (adict.items())]' – eumiro

0

od swoich łańcuchach daty wydają się być w odpowiednim formacie można po prostu zrobić:

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

Słowniki nigdy przechowywać coś w jakimś celu. Ale możesz uzyskać listę kluczy przy użyciu d.keys(), które można posortować. Iteruj nad generatorem jak poniżej.

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

Używając tego, będziesz w stanie dokonywać iteracji wartości w porządku chronologicznym.

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

nie potrzebujesz '.keys()' tam – SilentGhost

+0

@SilentGhost: oh Tak! proszę bardzo. –

16

Jeśli używasz Python 2.7+ lub 3.1 i nowsze można utworzyć OrderedDict from collections od rodzaju słownika a następnie iterację tego.

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

Jednakże, w zależności od tego, co chcesz zrobić, to chyba łatwiej iteracyjne nad posortowaną listę kluczy z dict.

+1

Co może być nawet lepsze niż tworzenie 'OrderedDict' lub pobieranie i następnie sortowanie kluczy po wprowadzeniu jakichkolwiek zmian w słowniku, będzie [SortedDict] (http://pypi.python.org/pypi/sorteddict). – martineau

+0

Dlaczego ludzie nadal używają 'klucza', gdy chcą po prostu naturalnej kolejności sortowania? –

+0

Dla początkujących Pythona takich jak ja, @martineau oznaczało, że możesz osiągnąć ten sam cel, taki jak ten 'zamów = OrderedDict (posortowane (tyłem).items()) ' Zauważ, że sortowanie działa tak samo, jeśli klucze są rzeczywistymi obiektami datetime, a nie ciągami. – jbustamovej

0

Python 2.7 (wydana w dniu 3 lipca 2010 roku) wspiera uporządkowaną rodzaj słownika:

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

+0

uporządkowany słownik zapamiętuje kolejność wstawiania. Ale moduł blist posortowałdict http://pypi.python.org/pypi/blist/ –

+0

, ale czy słownik zamówień nie ma funkcji "sortowania"? –

+0

Jeśli tak postąpisz, tak. A potem pozostanie na przyszłość. Bardziej naturalnym dla mnie byłoby sortowanie. –

Powiązane problemy