使用可能的null对任意类型的列表进行排序



我有一堆列表(它们来自数据库(,我想尽我所能对每个列表进行排序。然而,我事先不知道类型。由于它们来自数据库,所以大部分都会有日期、日期时间、字符串、数字和布尔值。

给定列表中的大多数值都是相同的类型,但有时会有令人讨厌的None(db字段大多可以为null(。

通常,如果我事先知道列表的类型,我会使用这样的东西作为我的key:

lambda el: el or 0

但将0替换为最合适的(即-math.inf""datetime.datetime.fromtimestamp(0)等(

以下是我的想法:

def sort_arbitrarily_typed_list(my_list):
try:
# Ideal situation - no nulls, all is happy
return sorted(my_list)
except:
pass
try:
# Maybe it's numbers?
return sorted(my_list, key=lambda el: el or 0)
except:
pass
try:
# Maybe strings?
return sorted(my_list, key=lambda el: el or "")
except:
# Catchall: just convert everything to a string and compare them.
return sorted(my_list, key=str)

这种方法有什么问题吗,或者有更好的方法吗?我认为str作为总括会很好。。。是否存在对值调用str失败的情况?

您可以主要按None-度排序,其次按值排序,因此它不会对None和其他值进行比较。

>>> my_list = [3, None, 1, None, 4]
>>> sorted(my_list, key=lambda x: (x is None, x))
[1, 3, 4, None, None]