假设我有一个清单:
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]
>>> 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
根据每个元素的结果对 interable 进行排序key(element)
(默认值key
是None
直接根据元素进行排序)。
在我们的例子中,lambdalambda e: e not in B
将返回True
if e
is not inB
或False
if e
is in B
。带有 ' 的元素False
被排在前面,最终得到结果。如下所示:
>>> sorted([True,False,False])
[False, False, True]
其中许多答案都明确地使用了集合逻辑。但是Python内置了它。如果如您所说,只要部分在前,顺序无关紧要B
,这将处理其余部分:
B = set(B)
list(B.intersection(A)) + list(set(A) - B)
这假设(如在您的示例中)没有重复值。如果有,请使用列表理解答案之一。
>>> 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]
>>> 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]
注意:这将删除重复的值 - 但在给定唯一键的情况下有效。
如果两者都已经排序(或按您的意愿排序),那么您可以使用:
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
或两者都...