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

时间:2018-01-12 21:13:37

标签: python

我正在尝试使用带

的日期属性对对象列表进行排序
list_of_objects.sort(key=lambda x: x.date, reverse=True)

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

TypeError: can't compare datetime.datetime to NoneType

有没有办法解释这个?例如在排序列表的顶部或底部放置date == None的对象 - 或者我是否需要手动执行此操作?

3 个答案:

答案 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)

您想要根据两个属性进行排序:

  1. 主要是,是否存在日期
  2. 其次,日期(如果存在)
  3. 您可以通过对元组进行排序来直接表达您的意图,其中

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