我正在尝试使用 date 属性对对象列表进行排序
list_of_objects.sort(key=lambda x: x.date, reverse=True)
但有些日期只是 None,这意味着我收到错误
TypeError: can't compare datetime.datetime to NoneType
有没有办法解决这个问题? 例如,将带有date == None
的对象放在排序列表的顶部或底部 - 还是我需要手动执行此操作?
您希望基于两个属性进行排序:
- 主要是日期是否存在
- 其次,日期(如果存在(
您可以通过对元组进行排序以直接的方式表达您的意图,其中
- 元组的第一个元素指定日期是否
None
,并且 - 元组的第二个元素是日期本身。
list_of_objects.sort(key=lambda x: (x.date is None, x.date), reverse=True)
此方法可避免您遇到的类型错误,因为元组之间的比较是从左到右延迟执行的。除非第一个元素相等,否则不会比较第二个元组元素。
以下是一些演示该概念的示例:
>>> xs = [None, 1, 3, None, 2]
>>> sorted(xs, key=lambda x: (x is None, x))
[1, 2, 3, None, None]
>>> sorted(xs, key=lambda x: (x is not None, x))
[None, None, 1, 2, 3]
>>> sorted(xs, key=lambda x: (x is None, x), reverse=True)
[None, None, 3, 2, 1]
>>> sorted(xs, key=lambda x: (x is not None, x), reverse=True)
[3, 2, 1, None, None]
您可以稍微修改您的 lambda:
from datetime import datetime
list_of_objects.sort(key=lambda x: x.date or datetime.min, reverse=True)
如果它们出现在排序的错误一端,请改用datetime.max
。
也许您应该在排序之前先过滤掉"无"的日期。