【问题标题】:OrderedDict sorting incorrectlyOrderedDict 排序不正确
【发布时间】:2021-12-07 17:44:18
【问题描述】:

据我了解,下面的结果应该是一个 OrderedDict 对象,其中的项目按键排序,这是一个日期时间对象。

ledger = OrderedDict(
    sorted(ledger.items(), key=lambda x: datetime.strftime(x[0], '%d-%m-%Y'))
)

但是,在我的情况下,对象被无序排序:

OrderedDict([
    (datetime.date(2021, 10, 1), {'net': -33924, 'entries': [{'text': 'Applied to 102101', 'amount': -16962, 'mode': 'debit'}, {'text': 'Applied to 102104', 'amount': -16962, 'mode': 'debit'}]}),
    (datetime.date(2021, 11, 3), {'net': -96118, 'entries': [{'text': 'Applied to 102104', 'amount': -96118, 'mode': 'debit'}]}), 
    (datetime.date(2021, 9, 24), {'net': 18000.0, 'entries': [{'text': 'Payment Received', 'amount': 18000.0, 'mode': 'credit'}]})
])

我在这里遗漏了哪些注意事项?

【问题讨论】:

  • 您首先按月份排序
  • 这可能是由于您的排序键是按str 对象而不是数值排序的。
  • 可以对日期时间对象进行排序,如果您只是删除键将其转换为排序不好的字符串,它就不能正常工作吗?
  • 为什么要将日期对象格式化为字符串?
  • 以后请提供minimal reproducible example。看起来 dict 方面在这里无关紧要,您可以使用简单的日期列表重现相同的问题:sorted(dates, key=lambda x: x.strftime('%d-%m-%Y'))。它还有助于获得预期的输出以避免像 ddejohn 的回答中那样混淆,以及避免在 datetimedatetime.datetime 之间混淆的导入。

标签: python python-datetime ordereddict


【解决方案1】:

如果您想以某种时间顺序的方式进行排序,您可以访问要排序的属性并使用元组排序:

sorted(datetimes, key=lambda d: (d.month, d.seconds))  # or some other weird sorting

如果只是按时间顺序排序,那么您无需费心:

In [3]: OrderedDict(sorted(ledger.items()))
Out[3]:
OrderedDict([(datetime.date(2021, 9, 24),
              {'net': 18000.0,
               'entries': [{'text': 'Payment Received',
                 'amount': 18000.0,
                 'mode': 'credit'}]}),
             (datetime.date(2021, 10, 1),
              {'net': -33924,
               'entries': [{'text': 'Applied to 102101',
                 'amount': -16962,
                 'mode': 'debit'},
                {'text': 'Applied to 102104',
                 'amount': -16962,
                 'mode': 'debit'}]}),
             (datetime.date(2021, 11, 3),
              {'net': -96118,
               'entries': [{'text': 'Applied to 102104',
                 'amount': -96118,
                 'mode': 'debit'}]})])

【讨论】:

  • %d%m 被定义为像 %Y-%m-%d 这样的东西会按照字典顺序排序,就像它按照时间顺序排序一样。但是datetime 对象已经按时间顺序排序,因此无需解构 key 函数中的参数。
  • 是的,你是对的,但我的印象是 OP 可能想要其他排序方法。
  • 不,哈哈,OP 只是可能需要收工。
  • 大声笑,没问题,我已经编辑为包含一个沼泽标准时间排序,只是为了正确回答问题。
猜你喜欢
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
相关资源
最近更新 更多