python排序两个列表 - zip,sort,zip - 不可排序的类型:int() < NoneType()



我有两个列表:

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工作后没有任何问题

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

您需要指定排序的键。如果您不关心两个"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个元素相同,因此必须比较第1个元素。由于两者都有一个可迭代的元素作为第一个元素,因此它按元素比较[None, None]['f', None]。但要做到这一点,它必须将'f'None进行比较,并且不能将None与Python 3中的内容进行比较(尽管在Python 2中可以)。

最新更新