在Python3中对没有值的元组列表进行排序

问题描述 投票:6回答:2

在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)]
python python-3.x python-2.x
2个回答
1
投票

在这种情况下,您可以使用自定义键功能将所有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)]

0
投票

一种方法可能是在排序之前将自定义函数定义为key,并捕获TypeError。另请注意,您要将数值强制转换为intfloat,因此排序过程不是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)]
© www.soinside.com 2019 - 2024. All rights reserved.