如何对列表进行排序并正确处理 None 值



我正在尝试使用 date 属性对对象列表进行排序

list_of_objects.sort(key=lambda x: x.date, reverse=True)

但有些日期只是 None,这意味着我收到错误

TypeError: can't compare datetime.datetime to NoneType

有没有办法解决这个问题? 例如,将带有date == None的对象放在排序列表的顶部或底部 - 还是我需要手动执行此操作?

您希望基于两个属性进行排序:

  1. 主要是日期是否存在
  2. 其次,日期(如果存在(

您可以通过对元组进行排序以直接的方式表达您的意图,其中

  1. 元组的第一个元素指定日期是否None,并且
  2. 元组的第二个元素是日期本身。
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

也许您应该在排序之前先过滤掉"无"的日期。

最新更新