OrderedDict 排序不正确

Posted

技术标签:

【中文标题】OrderedDict 排序不正确【英文标题】:OrderedDict sorting incorrectly 【发布时间】: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 之间混淆的导入。 【参考方案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 只是可能需要收工。 大声笑,没问题,我已经编辑为包含一个沼泽标准时间排序,只是为了正确回答问题。

以上是关于OrderedDict 排序不正确的主要内容,如果未能解决你的问题,请参考以下文章

Python中的OrderedDict

python中OrderedDict的使用

标准库:collections之orderedDict

OrderedDict如何在Python中保持秩序

MySQL order by - 排序不正确

MySQL order by 排序结果不正确