如何正确排序列表并处理None值?日期属性对象排序报错处理
解决含None日期属性的对象列表排序问题
这个问题我碰到过好多次了,完全不用手动拆分列表再合并,Python的sort方法的key参数就能优雅搞定!核心思路是给date为None的对象分配一个能明确排序位置的“占位值”,或者用元组排序来区分有无日期的情况。
方法一:用日期极值指定位置
如果你的日期是datetime类型,可以利用datetime.min(最早的时间)和datetime.max(最晚的时间)来控制None的位置:
把None排到列表底部(降序时有效日期从新到旧)
from datetime import datetime list_of_objects.sort(key=lambda x: x.date if x.date is not None else datetime.min, reverse=True)
原理:datetime.min是所有合法日期里最早的,在降序排序时会被挤到最后,刚好符合把None放底部的需求。
把None排到列表顶部(降序时None优先出现)
from datetime import datetime list_of_objects.sort(key=lambda x: x.date if x.date is not None else datetime.max, reverse=True)
原理:datetime.max是最晚的时间,降序时会排在最前面,让None的对象先出现。
如果是升序排序(reverse=False),逻辑反过来就行:要把None放底部就用datetime.max,放顶部用datetime.min。
方法二:用布尔元组更简洁
不用导入日期极值,直接用布尔值的特性(False < True)来做排序key:
把None排到列表底部(降序)
list_of_objects.sort(key=lambda x: (x.date is None, x.date), reverse=True)
解释:当x.date是None时,key是(True, None);否则是(False, 日期对象)。因为False < True,在降序排序时,False对应的元组会排在前面(有效日期),True的元组留在后面(None)。
把None排到列表顶部(降序)
list_of_objects.sort(key=lambda x: (x.date is not None, x.date), reverse=True)
解释:此时None对应的key是(False, None),有效日期是(True, 日期对象),降序时False的元组会优先排在前面。
这两种方法都不需要手动处理列表,直接在sort的key里完成逻辑,非常Pythonic。
内容的提问来源于stack exchange,提问作者carl
相关产品推荐
相关产品推荐

