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 的回答中那样混淆,以及避免在 datetime
和 datetime.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 排序不正确的主要内容,如果未能解决你的问题,请参考以下文章