我有一个类似下面的字典,并尝试按键(日期时间对象)对其进行排序:
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 :(得分: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/