按日期排序的Python OrderedDict

3 投票
2 回答
3736 浏览
提问于 2025-04-16 21:25

我正在尝试使用一个有序字典(OrderedDict,Raymond Hettinger 的 版本,适用于 Python 2.7 之前的版本),我的键是日期。不过它没有正确地对日期进行排序,我猜可能是根据 ID 来排序的。

有没有人有什么建议,能让我正确排序呢?

2 个回答

9
In [1]: from collections import OrderedDict

In [2]: import operator

In [3]: from datetime import date

In [4]: d = {date(2012, 1, 1): 123, date(2010,2,5): 542, date(2011,3,3):76 }

In [5]: d # Good old dict
Out[5]: #it seems sorted, but it isn't guaranteed to be that way.
{datetime.date(2010, 2, 5): 542,
 datetime.date(2011, 3, 3): 76,
 datetime.date(2012, 1, 1): 123}

In [6]: o = OrderedDict(sorted(d.items(), key=operator.itemgetter(0)))

In [7]: o #Now it is ordered(and sorted, because we give it by sorted order.).
Out[7]: OrderedDict([(datetime.date(2010, 2, 5), 542), (datetime.date(2011, 3, 3), 76), (datetime.date(2012, 1, 1), 123)])

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

4

OrderedDict,根据它的说明,是一种能够记住插入顺序的字典。也就是说,你需要手动按照正确的顺序插入键值对。

# assuming unordered_dict is a dict that contains your data 
ordered_dict = OrderedDict()
for key, value in sorted(unordered_dict.iteritems(), key=lambda t: t[0]):
    ordered_dict[key] = value

补充:可以看看utdemir的回答,里面有更好的例子。使用operator.itemgetter可以让你的代码运行得更快(快60%,我用下面的基准测试代码测过),而且这种写法更好。此外,你还可以直接把OrderedDict应用到sorted(...)函数上。

a = (1, 2)

empty__func = 0
def empty():
    for i in xrange(N_RUNS):
        empty__func

lambda_func = lambda t: t[0]
def using_lambda():
    for i in xrange(N_RUNS):
        lambda_func(a)

getter_func = itemgetter(0)
def using_getter():
    for i in xrange(N_RUNS):
        getter_func(a)

撰写回答