python排序两个列表-zip、sort、zip-无序类型:int()<;非类型()

python排序两个列表-zip、sort、zip-无序类型:int()<;非类型(),python,sorting,Python,Sorting,我有两份清单: a_list = ['a', 'k', 'a'] c_list = [[None, None], [13, None], ['f', None]] 我想按照列表的顺序对列表和列表进行排序。因此,在分类之后,我希望: a_list = ['a', 'a', 'k'] c_list = [[None, None], ['f', None], [13, None]] 我正在尝试使用zip,sort,zip方法来执行此操作,但在以下阶段会显示错误消息: a_c_zip = sorte

我有两份清单:

a_list = ['a', 'k', 'a']
c_list = [[None, None], [13, None], ['f', None]]
我想按照列表的顺序对列表和列表进行排序。因此,在分类之后,我希望:

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_c_zip=已排序(zip(a_列表,c_列表))
TypeError:无序类型:int()
我认为发生这种情况是因为两个
a
值不明确,但我想知道是否有解决办法?毕竟,对列表进行排序没有任何问题


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

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

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

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

>>> 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的原因是
排序
试图将
('a',[None,None])
('a',[f',None])
进行比较。由于两个元组的第0个元素相同,因此必须比较第1个元素。由于这两个元素都有一个iterable作为第一个元素,因此它将
[None,None]
[f',None]
元素进行比较。但要做到这一点,它必须将
'f'
None
进行比较,并且(尽管您可以在Python 2中进行比较)。

Python,因此未排序列表中的第一个“a”在排序列表中应该始终排在第一位。@senshin感谢您给出如此全面的答案。我在考虑尝试以下建议:
>>> 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])]