Python列表排序取决于项目是否在另一个列表中

时间:2013-05-16 11:18:13

标签: python list sorting

说我有一个清单:

A = [1,2,3,4,5,6,7,8,9,0]

和第二个清单:

B = [3,6,9]

对列表A进行排序的最佳方法是什么,以便与列表B中的项匹配的任何内容都将出现在开头,以便结果为:

[3,6,9,1,2,4,5,7,8,0]

5 个答案:

答案 0 :(得分:11)

>>> A = [1,2,3,4,5,6,7,8,9,0]
>>> B = [3,6,9]
>>> sorted(A,key=lambda e: e not in B)
[3, 6, 9, 1, 2, 4, 5, 7, 8, 0]

这是如何运作的:

sorted根据key(element)对每个元素的结果对可互换进行排序(key的默认值为None,这会导致直接根据元素进行排序)。

在我们的案例中,如果lambda e: e not in B中的True 不是 ,则e将返回B False ,或e B如果False >>> sorted([True,False,False]) [False, False, True] 。带有{{1}}的元素会排在前面,最后会得到结果。如下所示:

{{1}}

答案 1 :(得分:3)

其中许多答案都明确使用了设定逻辑。但是Python内置了它。如果正如你所说的那样,只要B部分首先出现,顺序就无关紧要了,这将照顾其余部分:

B = set(B)
list(B.intersection(A)) + list(set(A) - B)

这假定(如您的示例中)没有重复值。如果有,请使用列表理解答案之一。

答案 2 :(得分:2)

>>> A = [1,2,3,4,5,6,7,8,9,0]
>>> B = [3,6,9]
>>> [i for i in B if i in A] + [i for i in A if i not in B]
[3, 6, 9, 1, 2, 4, 5, 7, 8, 0]

答案 3 :(得分:2)

>>> A = [1,2,3,4,5,6,7,8,9,0]
>>> B = [3,6,9]
>>> b = set(B)
>>> sorted(A, key=b.__contains__, reverse=True)
[3, 6, 9, 1, 2, 4, 5, 7, 8, 0]

答案 4 :(得分:0)

注意:这会删除重复的值 - 但会使用唯一键。

如果两者都已经排序(或按照您的意愿订购),那么您可以使用:

A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
B = [3, 6, 9]

from collections import OrderedDict
from itertools import chain

print list(OrderedDict.fromkeys(chain(B, A)))
# [3, 6, 9, 1, 2, 4, 5, 7, 8, 0]

否则,只需将sorted应用于AB或两者......