Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 找到两个列表的公共元素的最快方法,而无需更改第一个列表的顺序_Python_Python 3.x_List_Dictionary_List Comprehension - Fatal编程技术网

Python 找到两个列表的公共元素的最快方法,而无需更改第一个列表的顺序

Python 找到两个列表的公共元素的最快方法,而无需更改第一个列表的顺序,python,python-3.x,list,dictionary,list-comprehension,Python,Python 3.x,List,Dictionary,List Comprehension,我有两张名单 l1 = [1,4,3,2,5] l2 = [4,3,2,10] 现在我想找到to列表之间的公共元素,所以我使用以下代码 list(set(l1).intersection(set(l2))) >> [2, 3, 4] 但是它改变了l1的顺序,我不想改变顺序,所以结果应该是 >> [4, 3, 2] 正在寻找在不更改顺序的情况下执行此操作的最快方法?您可以使用l1对结果重新排序: >>> sorted(set(l1).inters

我有两张名单

 l1 = [1,4,3,2,5]
 l2 = [4,3,2,10]
现在我想找到to列表之间的公共元素,所以我使用以下代码

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)

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

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

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

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

假设您希望保留
l1
的序列。时间复杂度为O(n^2)的算法是,如果
l2
中存在
x
,则查找
l1
中的每个项目
x
。下面的代码可以工作

common_elements = [x for x in l1 if x in l2]
通过使用map(dict),可以将时间复杂度降低到O(n)

编辑:发现Python的
set
是作为一个哈希映射实现的,在平均情况下查找需要O(1),所以下面的示例的平均情况复杂度也应该是O(n)


只需添加一些分析—将l2转换为一个集合并对照它检查l1是有效的解决方案,应该使用。如果它们出现在l1中,它还维护相同值的多个副本,维护顺序,并执行最小工作量。这里介绍的其他解决方案对于较大的输入速度明显较慢。这是否回答了您的问题?
common_elements = [x for x in l1 if x in l2]
lookup_map = {x: True for x in l2}
common_elements = [x for x in l1 if x in lookup_map]
common_elements = [x for x in l1 if x in set(l2)]