在不改变第一个列表的顺序的情况下找到两个列表的公共元素的最快方法

Kal*_*lol 2 python dictionary list-comprehension list python-3.x

我有两个清单,

 l1 = [1,4,3,2,5]
 l2 = [4,3,2,10]
Run Code Online (Sandbox Code Playgroud)

现在我想找到列表之间的公共元素,所以我使用以下代码,

list(set(l1).intersection(set(l2)))
>> [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

但它改变了 的顺序l1,我不想改变顺序所以结果应该是,

>> [4, 3, 2]
Run Code Online (Sandbox Code Playgroud)

寻找在不改变顺序的情况下执行此操作的最快方法?

Sel*_*cuk 5

您可以使用l1以下方法重新排序结果:

>>> sorted(set(l1).intersection(set(l2)), key=l1.index)
[4, 3, 2]
Run Code Online (Sandbox Code Playgroud)

您也可以使用列表理解而不是集合交集,但我相信第一种方法通常会更快,具体取决于每个列表中的元素数量,因为搜索列表是O(n),下面的解决方案变为O(n*m)

>>> [i for i in l1 if i in l2]
[4, 3, 2]
Run Code Online (Sandbox Code Playgroud)

最后,您可以通过转换l2为集合来优化理解方法:

>>> s2 = set(l2)
>>> [i for i in l1 if i in s2]
[4, 3, 2]
Run Code Online (Sandbox Code Playgroud)