【问题标题】:Python OrderedDict ordered by datePython OrderedDict 按日期排序
【发布时间】:2025-12-25 02:25:17
【问题描述】:

我正在尝试使用 OrderedDict(Raymond Hettingers version for pre2.7 Python),其中我的键是日期。但是它没有正确订购它们,我想它可能是根据 ID 订购的。

有人对如何做到这一点有任何建议吗?

【问题讨论】:

  • 你能举个例子来说明你所谓的约会吗?
  • 您能给我们举个例子,您是如何实现这一目标的?在我的系统(原始 Python 实现)上,它可以正常工作。
  • 请记住,它是一个有序字典,而不是一个排序字典。 (我在 Uni 的软件工程课程中经常遇到对“有序”和“排序”之间区别的理解不足,即使是几位讲师也是如此。)
  • @Chris 你是对的,我误解了。我把它当作一个排序的字典来处理。

标签: python datetime date ordereddictionary


【解决方案1】:

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)

【讨论】:

  • @juanchopanza 不,我只是在循环中比较了普通的 itemgetter 和 lambda。见上面的代码。
【解决方案2】:
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)])

【讨论】:

  • 其实,当你使用dates作为key时,它保证被排序的(记得叫它sorted,而不是ordered),至少在 CPython 的当前实现中是这样。字典项目顺序是通过项目比较得出的,这是为datetime.date 正确定义的。因此,如果您想使用这样的键类型,您可以使用 dict 而不是 OrderedDict(并且您会记得对您所依赖的行为发表评论 - Python 的另一个实现可能不会打破这种行为。)
  • @Chris,我看不出OrderedDict 如何满足其保持插入顺序和逐项比较顺序的承诺。并且普通的旧 dict 使用散列,并且不能假设顺序。
  • @Chris Morgan,在我的系统上,Python 2.7.2 和 Python 3.2.1,dict 没有排序。
  • @utdemir 啊我忘记用itemgetter了。它在性能和可理解性上都更好。
  • @Overmind:其实, key=operator.itemgetter(0)是多余的; dict.items() 返回 list(key, value) tuples。 tuple 比较是通过比较第一个项目来完成的,然后如果它们相同,那么第二个等等。但是第一项将是不同的,因为它们已被用作dict 中的键。所以它基本上意味着第一项比较(但更快)。