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

Python列表排序取决于项目是否在另一个列表中,python,list,sorting,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] 工作原理: sorted根据每个元素的key(element)的结果对一个interable进行排序(key的默认值为None,它直接根据元素进行排序) 在本例中,如果e在B中不是e,lambdae:e不在B中,将返回True,如

假设我有一张清单:

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]
工作原理:

sorted
根据每个元素的
key(element)
的结果对一个interable进行排序(key的默认值为
None
,它直接根据元素进行排序)

在本例中,如果
e
B
中不是
e,lambda
e:e不在B
中,将返回
True
,如果
e
B
中,则返回
False
。元素的
False
被排序到最前面,最后得到结果。如下所示:

>>> sorted([True,False,False])
[False, False, True]

注意:这将删除重复的值-但在给定唯一键时有效。

如果两者都已排序(或按您的意愿排序),则可以使用:

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
或两者……

这些答案中的许多都明确使用了集合逻辑。但是Python内置了它。如您所说,如果只要
B
零件排在第一位,顺序就无关紧要,那么剩下的部分就可以考虑了:

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

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

B是否必须排序?否,A和B可以以任何顺序开始。只要B中的排序在A中的排序之前,它们就不一定需要在最后进行排序。@Ashy你说它们不一定需要排序是什么意思,你想让它们在最后进行排序吗?它们是按原始顺序排序还是按排序并不重要,只要B中出现的是第一位的,同样,没有特定的顺序。更新问题:
A
可以是任何顺序,因此目前没有work@jamylak:但OP也表示确切的输出顺序无关紧要,OP给出的示例--
[3,6,9,1,2,4,5,7,8,0]
--保留了原始顺序而不是排序。因此,我认为这个解决方案是可行的(尽管如果大小更大,将B变成一个集合可能是有意义的)。不错,但更喜欢
e不在B
中,而不是等效的
不在B
@wim。你说得对,这更像是一个python!有时我会忘记这些细节。如果
B
中的项目不在
A
中怎么办我认为我们不应该把它添加到列表+1中,但我会做
>>A,B=set(A),set(B)
这也应该更快,因为
B
不需要像本例中那样隐式转换为
set
两次。而且
A
被转换为
set
twice@jamylak他可能想把整个事情重新分配给
A[:]
,所以我接受了你的建议,但跳过了
A
的永久
设置。
>>> 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]
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]
>>> b = set(B)
>>> sorted(A, key=b.__contains__, reverse=True)
[3, 6, 9, 1, 2, 4, 5, 7, 8, 0]