2010-10-20 2 views
12

У меня есть словарь. Ключами являются даты (дата и время). Мне нужно отсортировать словарь так, чтобы значения в словаре сортировались по дате - так что, итерации через словарь, я обрабатываю элементы в желаемом хронологическом (то есть дате/времени) порядке.Сортировка словаря (с ключами даты) в Python

Как я могу сортировать такой словарь по дате?

Пример:

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

Примечание: Я использую строки здесь вместо DateTime, чтобы этот пример простой

+2

сортировки должны работать в формате гггг-мм-дд как строки также. –

+0

Рад, что кто-то уже спросил об этом;) – PeterM

ответ

2

Словари являются unsortable. Итерируйте вместо sorted(mydict.keys()).

+3

можно также сказать 'sorted (mydict)', если вы предпочитаете. –

+0

Правильно, я все время забываю об этом ... –

+1

или 'sorted (mydict.items())' –

0

Я уверен, что python знает, как сравнивать даты. Итак:

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

Python без проблем сравнивает объекты datetime. В этом случае строки 'YYYY-MM-DD' также корректно сопоставимы. Проблемой будет дата в формате 'MM/DD/YYYY' или' DD.MM.YYYY', но не с 'YYYY-MM-DD'. – eumiro

+2

Последние три строки вашего кода также могут быть записаны как 'return [значение для ключа, значение в sorted (adict.items())]' – eumiro

0

, поскольку ваши даты строки кажутся в нужном формате, который вы могли бы просто сделать:

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

Словари никогда ничего в определенном порядке и не хранить. Но вы можете получить список ключей, используя d.keys(), которые можно сортировать. Итерации над генератором, как показано ниже.

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

Используя это, вы сможете перебирать значения в хронологическом порядке.

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

вам не нужно '.keys()' there – SilentGhost

+0

@SilentGhost: oh Да! там ты идешь. –

16

Если вы используете Python 2.7+ или 3.1+ можно создать OrderedDict from collections из рода словаря, а затем итерацию через это.

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

Однако, в зависимости от того, что вы хотите сделать, это, вероятно, легче перебирать отсортированный список ключей от вашего Dict.

+1

Что может быть даже лучше, чем создание «OrderedDict» или получение и сортировка ключей после внесения каких-либо изменений в словарь, будет [SortedDict] (http://pypi.python.org/pypi/sorteddict). – martineau

+0

Почему люди упорствуют в использовании 'key', когда они просто хотят упорядочить естественный порядок? –

+0

Для новичков Python, подобных мне, @martineau означало, что вы можете выполнить ту же цель, что и этот 'ordered = OrderedDict (отсортировано (mydict.items()) ' Обратите внимание, что сортировка работает одинаково, если ключи являются фактическими объектами datetime, а не строками – jbustamovej

0

Python 2.7 (выпущен 3 июля 2010) поддерживает упорядоченный словарь тип:

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

+0

Заказываемый словарь запоминает порядок вставки. Но модуль blist имеет sorteddict http://pypi.python.org/pypi/blist/ –

+0

, но не в словаре заказов также есть функция «сортировки»? –

+0

Если вы так выразились, да. И тогда это останется для будущего использования. Для меня естественнее было бы разобраться. –