【问题标题】:python sorting two lists - zip, sort, zip - unorderable types: int() < NoneType()python对两个列表进行排序 - zip、sort、zip - 不可排序的类型:int() < NoneType()
【发布时间】:2016-04-09 20:36:30
【问题描述】:

我有两个列表:

a_list = ['a', 'k', 'a']
c_list = [[None, None], [13, None], ['f', None]]

我想按照 a_list 的顺序对 a_list 和 c_list 进行排序。所以排序后我想拥有:

a_list = ['a', 'a', 'k']
c_list = [[None, None], ['f', None], [13, None]]

我正在尝试使用zipsortzip 方法来实现,但它在以下阶段给了我错误消息:

a_c_zip = sorted(zip(a_list,c_list))

TypeError: unorderable types: int() < NoneType()

我认为这是因为两个 a 值不明确,但我想知道是否有解决方法?毕竟排序 a_list 没有任何问题

我真的不想编写自己的排序例程,因为它会很慢。

【问题讨论】:

    标签: python sorting


    【解决方案1】:

    您需要指定要排序的键。如果您不关心两个“a”条目的排序顺序,您可以告诉sorted 查看zip 生成的每对的第一个元素(其中每对包含来自a_list 后跟 c_list 中的一个元素。

    >>> a_list = ['a', 'k', 'a']
    >>> c_list = [[None, None], [13, None], ['f', None]]
    >>> sorted(zip(a_list, c_list), key=lambda pair: pair[0])
    [('a', [None, None]), ('a', ['f', None]), ('k', [13, None])]
    

    如果您确实关心两个“a”条目的排序方式(也就是说,您希望它们的排序方式取决于c_list 中的相应条目),您需要弄清楚如何您希望None、整数和字符串相互排序。

    一种可能性是将None 视为'' 并将数字视为它们的字符串表示形式,并利用Python 按其元素的值从左到右对可迭代对象进行排序的事实:

    >>> sorted(zip(a_list, c_list),
           key=lambda pair: (pair[0], ['' if elem is None else str(elem) for elem in pair[1]]))
    [('a', [None, None]), ('a', ['f', None]), ('k', [13, None])]
    

    或者类似的东西。

    您收到 TypeError 的原因是 sorted 尝试将 ('a', [None, None])('a', ['f', None]) 进行比较。由于两个元组的第 0 个元素相同,因此必须比较第一个元素。由于两者都有一个可迭代的元素作为第一个元素,因此它将 [None, None]['f', None] 元素进行比较。但要这样做,它必须将 'f'Noneyou can't compare None against stuff in Python 3 进行比较(尽管在 Python 2 中可以)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2018-03-15
    • 2014-06-21
    • 2020-11-06
    • 2016-08-03
    相关资源
    最近更新 更多