2014-10-30 90 views
5

我有兩個平面列表,其中一個列表包含重複值。 例如,兩個列表保持重複的Python交集

array1 = [1,4,4,7,10,10,10,15,16,17,18,20] 
array2 = [4,6,7,8,9,10] 

我需要找到在陣列1,同時也是在數組2的值,在陣列1保留副本。 期望中的結果將是

result = [4,4,7,10,10,10] 

我想避免環路作爲實際陣列將包含超過百萬的價值。 我已經嘗試了各種設置和相交組合,但只是不能保留重複。

任何幫助將不勝感激!

+1

你不能避免循環..如果你使用庫函數..他們實際上在他們的設計中使用循環 – mlwn 2014-10-30 21:12:39

回答

4

你是什麼意思,你不想使用循環?你將不得不以某種方式迭代它。只要看看在每個項目單獨和檢查它是否在array2,當您去:

items = set(array2) 
found = [i for i in array1 if i in items] 

此外,這取決於你將如何使用的結果,考慮具有發電機:

found = (i for i in array1 if i in array2) 

,這樣你就不必一次把所有的東西都記在記憶裏。

+0

我的意思是我想知道是否有一種有效的方法來做到這一點,因爲我將與非常大的尺寸具有時序限制的數組.. – user32147 2014-10-30 21:16:55

+0

@ user32147:爲什麼不指定數組的大小(比「超過數百萬個值」更精確)以及時間限制? – NPE 2014-10-30 21:17:47

+0

@ user32147這非常高效:你不會比O(n)更快。但無論如何看我的編輯,我已經對答案做了一點小改進。 – 2014-10-30 21:18:30

3

有以下將做到這一點:

array1 = [1,4,4,7,10,10,10,15,16,17,18,20] 
array2 = [4,6,7,8,9,10] 
set2 = set(array2) 
print [el for el in array1 if el in set2] 

它保持秩序,array1元素的重複。

它將array2變成一個集合,以加快查找速度。請注意,如果array2足夠大,這只是有益的;如果array2很小,則將其保留爲列表可能更有效。