[英]Fastest way of finding common elements between two list of lists in python
[英]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.