在Python 3中,排序比较运算符( =,>)引发一个操作数没有有意义的自然数时出现TypeError异常订购
如果没有None值,则此比较更改将很难对元组列表进行排序。
在Python 2中:
>>> unordered_list = [('3', '1', None), ('3','1', '4'), ('3', '1', None)]
>>> sorted(unordered_list, reverse=True)
[('3', '1', '4'), ('3', '1', None), ('3', '1', None)]
在Python 3中:
>>> unordered_list = [('3', '1', None), ('3','1', '4'), ('3', '1', None)]
>>> sorted(unordered_list, reverse=True)
TypeError: unorderable types: str() < NoneType()
您是否知道如何在Python 3中以优雅的方式具有相同的行为?
NOTE:在以上示例中,我有整数,但这只是一个示例。元组的元素可以是任何类型。
ex.2 [('test3','test1', 'test4'), ('test3', 'test1', None)]
ex.3 [( 3, 1, 4), (3, 1, None)]
ex.4 [( 3.1, 1.1, 4.1), (3.1, 1.1, None)]
在这种情况下,您可以使用自定义键功能将所有None
转换为空字符串,例如:
sorted(unordered_list, key=lambda L: tuple(el or '' for el in L), reverse=True)
将给您:
[('3', '1', '4'), ('3', '1', None), ('3', '1', None)]
一种方法可能是在排序之前将自定义函数定义为key
,并捕获TypeError
。另请注意,您要将数值强制转换为int
或float
,因此排序过程不是lexicographical。
def handle_none(t):
out = tuple()
for i in t:
try:
out += (float(i),)
except TypeError:
out += (-float('inf'),)
return out
sorted(unordered_list, key=handle_none, reverse=True)
# [('3', '1', '4'), ('3', '1', None), ('3', '1', None)]