说我有一个清单:
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]
答案 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
应用于A
,B
或两者......