按日期键排序python字典

时间:2012-08-10 20:18:40

标签: python datetime data-structures

我有一个类似下面的字典,并尝试按键(日期时间对象)对其进行排序:

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}

提前致谢。

2 个答案:

答案 0 :(得分:3)

Dicts没有可靠的订单。

您可以使用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,为您提供所需的结果。但重要的是要记住,您对字典的任何后续添加都将出现在最后,而不是根据键顺序在正确的位置。

答案 1 :(得分:1)

OrderedDict保留插入顺序(年表),而不是键顺序。普通字典也不保留。

对于按键排序的词典,您可能需要Treap,Red-Black树或计算机科学已知的许多其他树数据结构之一。

Treaps的平均速度很快,但在不经常的时候会有点慢,因为它会重新平衡。

红黑树是众所周知的,相对复杂(与treaps相比),并且平均表现良好。它们的主要好处是它们没有高度可变的性能,使它们有时在用户界面中很好。

我最近对数据结构进行了性能比较,这些数据结构类似于dicts但具有排序键。可在此处找到:http://stromberg.dnsalias.org/~strombrg/python-tree-and-heap-comparison/