我有两个列表:
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]]
我正试图用zip
、sort
、zip
方法来做这件事,但它在以下阶段给了我错误消息:
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中可以)。