我正在尝试使用带
的日期属性对对象列表进行排序list_of_objects.sort(key=lambda x: x.date, reverse=True)
但有些日期只是无,这意味着我收到了错误
TypeError: can't compare datetime.datetime to NoneType
有没有办法解释这个?例如在排序列表的顶部或底部放置date == None
的对象 - 或者我是否需要手动执行此操作?
答案 0 :(得分:14)
您可以稍微修改一下lambda:
from datetime import datetime
list_of_objects.sort(key=lambda x: x.date or datetime.min, reverse=True)
如果他们出现在排序的错误末尾,请改用datetime.max
。
答案 1 :(得分:13)
您想要根据两个属性进行排序:
您可以通过对元组进行排序来直接表达您的意图,其中
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]
答案 2 :(得分:0)
也许你应该在排序之前先过滤掉None的日期。