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

时间:2016-01-05 21:26:58

标签: python sorting

我有两个清单:

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可以正常运行

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

1 个答案:

答案 0 :(得分:4)

您需要指定要排序的键。如果您不关心两个“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个元素。由于两者都有一个iterable作为第一个元素,因此它将[None, None]['f', None]元素进行比较。但要这样做,它必须将'f'Noneyou can't compare None against stuff in Python 3进行比较(尽管您可以在Python 2中进行比较)。