Сортировать словарь Python по ключам даты

1

У меня есть диктофон, как показано ниже, и пытается сортировать его по ключам (которые являются объектами даты):

def t(date_st):
    return datetime.strptime(date_st, '%d-%m-%Y')

def sort_dict_data(data):
keylist = data.keys()
keylist.sort()
sorted_x = {}
for key in keylist:
    sorted_x.update({datetime.strftime(key, '%d-%m-%Y'):data.get(key)})
return sorted_x



print sort_dict_data({t('07-07-2012'): 3.5, t('09-07-2012'): 9.0, t('08-07-2012'): 5.0})
results: {'07-07-2012': 3.5, '09-07-2012': 9.0, '08-07-2012': 5.0}

Как я могу это понять:

{'07-07-2012': 3.5, '08-07-2012': 5.0, '09-07-2012': 9.0}

Заранее спасибо.

  • 0
    Словари неупорядочены. Вы можете отсортировать ключи и сохранить их в массиве, но если поместить их обратно в текст, это не приведет к их сортировке.
Теги:
datetime
data-structures

2 ответа

2
Лучший ответ

У диктатов нет надежного порядка.

OrderedDict этого вы можете использовать OrderedDict.

def sort_dict_data(data):
    return OrderedDict((datetime.strftime(k, '%d-%m-%Y'), v)
                       for k, v in sorted(data.iteritems()))

Смотрите, как работает онлайн: ideone

Обратите внимание, что заказы OrderedDict соответствуют порядку вставки, а не по порядку. Вышеупомянутый код вставляет элементы в OrderedDict в порядке OrderedDict, давая вам результат, который вы хотите. Но важно помнить, что любые последующие дополнения, которые вы вносите в словарь, будут отображаться в конце, а не в правильном положении в соответствии с порядком клавиш.

1

OrderedDict сохраняет порядок вставки (хронологию), а не порядок клавиш. Обычный запрет тоже не сохраняется.

Для словарей, отсортированных по ключам, вам, скорее всего, понадобится дерево Treap, красно-черное дерево или одна из многих других древесных структур данных, известных компьютерной науке.

Treaps быстро в среднем, но будет немного медленным один раз в редкий момент, так как он перебалансирует себя.

Красно-черные деревья хорошо известны, относительно сложны (по сравнению с treaps), и в среднем дают показатели ОК. Их главным преимуществом является то, что они не имеют высокой переменной производительности, что делает их иногда приятными в пользовательских интерфейсах.

Недавно я сравнивал производительность структур данных, подобных диктофонам, но с сортированными ключами. Его можно найти здесь: http://stromberg.dnsalias.org/~strombrg/python-tree-and-heap-comparison/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню