8

假设我有一个清单:

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]
4

5 回答 5

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根据每个元素的结果对 interable 进行排序key(element)(默认值keyNone直接根据元素进行排序)。

在我们的例子中,lambdalambda e: e not in B将返回Trueif e is not inBFalseif e is in B。带有 ' 的元素False被排在前面,最终得到结果。如下所示:

>>> sorted([True,False,False])
[False, False, True]
于 2013-05-16T11:20:31.290 回答
3

其中许多答案都明确地使用了集合逻辑。但是Python内置了它。如果如您所说,只要部分在前,顺序无关紧要B,这将处理其余部分:

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

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

于 2013-05-16T11:37:09.887 回答
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]
于 2013-05-16T11:21:01.970 回答
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]
于 2013-05-16T11:45:30.383 回答
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]

否则,只适用sortedAB或两者都...

于 2013-05-16T11:27:44.780 回答