繁体   English   中英

最快的方法找到两个列表的共同元素而不改变第一个列表的顺序

[英]fastest way find the common elements of two lists without changing the sequence of first list

我有两个清单,

 l1 = [1,4,3,2,5]
 l2 = [4,3,2,10]

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

list(set(l1).intersection(set(l2)))
>> [2, 3, 4]

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

>> [4, 3, 2]

在不改变顺序的情况下寻找最快的方法?

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

>>> sorted(set(l1).intersection(set(l2)), key=l1.index)
[4, 3, 2]

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

>>> [i for i in l1 if i in l2]
[4, 3, 2]

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

>>> s2 = set(l2)
>>> [i for i in l1 if i in s2]
[4, 3, 2]

假设您要保留l1的序列。 如果x存在于l2中,则 O(n^2) 时间复杂度的算法将查找l1中的每个项目x 以下代码将起作用

common_elements = [x for x in l1 if x in l2]

您可以使用 map(dict) 将时间复杂度降低到 O(n)

lookup_map = {x: True for x in l2}
common_elements = [x for x in l1 if x in lookup_map]

编辑:发现 Python 的set是作为哈希映射实现的,并且查找在平均情况下需要 O(1) https://wiki.python.org/moin/TimeComplexity ,所以下面也应该有一个平均值。 O(n) 的情况复杂度

common_elements = [x for x in l1 if x in set(l2)]

最快的方法取决于数据,但这个解决方案应该是最快的方法之一

[x for x in [1, 4, 3, 2, 5] if x in {4, 3, 2, 10}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM