OrderedDict以datetime对象为键排序结果异常是什么原因?
排序异常原因分析
- 核心错误是使用了顺序不符合排序逻辑的日期字符串作为排序键
你当前用strftime(x[0], '%d-%m-%Y')生成的是「日-月-年」格式的字符串,字符串排序规则是逐位对比字符编码,会优先比较「日」的数值,而非实际日期先后。比如示例中的2021-10-1格式化后是01-10-2021,首字符0小于2021-9-24格式化结果24-09-2021的首字符2,因此最终排序里10月的记录反而排在9月之前,不符合预期。 - 不必要的类型转换引入了额外出错风险
Python的datetime.date对象本身原生支持直接比较大小,完全不需要额外转成字符串作为排序键,多余的转换操作反而容易出现格式写错的问题。
修正方案
直接用日期对象本身作为排序键即可,代码如下:
ledger = OrderedDict( sorted(ledger.items(), key=lambda x: x[0]) )
如果你确实有需要使用字符串作为排序键的场景,必须使用「年-月-日」的格式顺序(且补全前导零)才能保证字符串排序结果和日期先后一致,写法如下:
# 仅为特殊场景下的兼容写法,优先使用直接比较date对象的方案 ledger = OrderedDict( sorted(ledger.items(), key=lambda x: datetime.strftime(x[0], '%Y-%m-%d')) )
内容的提问来源于stack exchange,提问作者Adam Starrh
相关产品推荐
相关产品推荐

