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

Python 如何对列表进行排序并正确处理None值?,python,Python,我正在尝试使用date属性对对象列表进行排序 list_of_objects.sort(key=lambda x: x.date, reverse=True) 但是有些日期是零,这意味着我得到了错误 TypeError: can't compare datetime.datetime to NoneType 有没有办法解释这一点?e、 g.在排序列表的顶部或底部有date==None的对象,或者我需要手动执行此操作吗?您可以稍微修改lambda: from datetime import d

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

list_of_objects.sort(key=lambda x: x.date, reverse=True)
但是有些日期是零,这意味着我得到了错误

TypeError: can't compare datetime.datetime to NoneType

有没有办法解释这一点?e、 g.在排序列表的顶部或底部有
date==None
的对象,或者我需要手动执行此操作吗?

您可以稍微修改lambda:

from datetime import datetime

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

如果它们出现在排序的错误端,请改用
datetime.max

在排序之前,您可能应该先过滤掉无日期。

您希望根据两个属性进行排序:

  • 主要是日期是否存在
  • 第二,日期(如有)
  • 通过对元组进行排序,您可以直接表达您的意图,其中

  • 元组的第一个元素指定日期是否为
    None
    ,以及
  • 元组的第二个元素是日期本身
  • 这种方法避免了您得到的类型错误,因为元组之间的比较是从左到右延迟执行的。除非第一个元素相等,否则不会比较第二个元组元素

    以下是一些示例,演示了该概念:

    >>> 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]
    

    如果为空x.date返回默认日期,例如今天,该方法的示例可能会很有用。。以@wim的答案为例。给出一个解决方案,而不仅仅是一个建议。和平
    >>> 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]