2

我有一个像下面这样的字典,并试图通过键(它们是日期时间对象)对其进行排序:

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}

提前致谢。

4

2 回答 2

3

字典没有可靠的顺序。

您可以使用 anOrderedDict来代替。

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

在线查看它:ideone

注意OrderedDict顺序是按插入顺序,而不是按键顺序。上面的代码将项目插入到OrderedDict键顺序中,为您提供所需的结果。但重要的是要记住,以后对字典所做的任何添加都将出现在最后,而不是根据键顺序出现在正确的位置。

于 2012-08-10T20:22:11.330 回答
1

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

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

Treaps 平均速度很快,但偶尔会有点慢,因为它会重新平衡自己。

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

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

于 2012-08-10T20:30:49.400 回答