簡體   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