两个列表之间的公共元素,并保留两个列表中元素的顺序

shn*_*shn 5 python list

我有两个清单list1list2.我在stackoverflow上发现了一个非常简单的方法来获取这两个列表中的公共元素,如下所示result = list(set(list1) & set(list2)).不幸的是,使用它,不保留结果列表中元素的顺序.

例如:

list1 = ['a', 'e', 't', 'b', 'c']
list2 = ['e', 'b', 'a', 'c', 'n', 's']
Run Code Online (Sandbox Code Playgroud)

我希望结果(常用元素)['e', 'a', 'b', 'c']按此顺序排列.例如,因为'e'位于list1和list2中,位于list1中的位置2和list2中的位置1,而'a'位于list1和list2中,位于list1中的位置1和list2中的位置3,所以'e'在'a'之前,因为2 + 1 <1 + 3.

那么,有没有简单的方法在两个列表之间使用公共元素并保留元素的顺序?

Kev*_*vin 5

您可以使用列表理解来过滤list1不属于的所有元素list2

list1 = ['a', 'e', 't', 'b', 'c']
list2 = ['e', 'b', 'a', 'c', 'n', 's']

result = [item for item in list1 if item in list2]
print result
Run Code Online (Sandbox Code Playgroud)

结果:

['a', 'e', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

尽管这不符合您主要帖子中期望的结果,但从您的后续评论来看,这似乎是一个可以接受的结果。


您还可以继续使用 set 方法,然后使用您描述的定位算法对结果进行排序:

list1 = ['a', 'e', 't', 'b', 'c']
list2 = ['e', 'b', 'a', 'c', 'n', 's']

items = set(list1) & set(list2)
result = sorted(items, key=lambda element: list1.index(element) + list2.index(element))

print result
Run Code Online (Sandbox Code Playgroud)

结果:

['e', 'a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)


ndp*_*dpu 4

list1 = ['a', 'e', 't', 'b', 'c']
list2 = ['e', 'b', 'a', 'c', 'n', 's']

weights = defaultdict(int)

for i, e in enumerate(list1):
   weights[e] += i

for i, e in enumerate(list2):
   weights[e] += i

>>> result = sorted(set(list1) & set(list2), key=lambda i: weights[i])
>>> result
['e', 'a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)