2015-12-02 98 views
3

我有2個列表,我想逐個比較這些列表。 例如:逐項比較兩個列表

a = [1,2,3] 
b = [2,3,1] 
for i in a: 
    if i in b: 
     pass # do something 
    else: 
     pass # do something else instead 

我覺得這個實現有點微不足道。

我想知道其他有效完成任務的方法。
(效率意味着無論是時間複雜度和空間複雜度)

回答

3

您可以使用組找到ab的共同元素。

common_elements = set(a) & set(b) 
for item in a: 
    if item in common_elements: 
     pass # do something 
    else: 
     pass # do something else instead 

集結構是在平均情況下O(N),和集合成員資格測試是O(1),使得在此總整個算法O(N)。相比之下,列表的成員資格測試是O(N),所以您的原始算法是O(N^2)。

+0

謝謝。我很感謝你的解決方案,但我無法將列表轉換爲集合。我只能使用列表 –

+0

@KshitijSaraogi:爲什麼你不能使用集?你在使用Python的_really_舊版本嗎?如果你不能使用集合,那麼你堅持使用O(n^2)算法......除非你實現自己的散列表,而這個散列表將以Python速度運行緩慢,而不是你使用Python獲得的C速度組。 –

+0

@ PM2Ring我正在處理一些對象的列表,我想在其他幾個地方使用這些列表。此外,我個人不喜歡類型鑄造的操作。 –

0

我們可以使用臨時數組來檢查a的每個元素是否存在於b中。這個數組的大小應該大於兩個列表中可以存在的最大元素(我使用的是32位系統中Python列表的最大大小爲536,870,912,所以這種方法在正常情況下會工作)。該臨時列表temp_b最初將具有等於零的每個元素。現在,對於列表b中的所有整數,我們將把該索引處的值初始化爲1,表明該元素存在於b中。在此之後,我們要做的是:對於a中的每個元素i,檢查是否temp_b[i] == 1?如果是,那麼該元素存在,否則不存在。

請注意,要檢查a中每個元素的頻率是否也與b匹配,我們將不得不修改此代碼。複雜性將與數組的大小成線性關係。

a = [2, 5, 4, 7, 6, 8, 9] 
b = [1, 3, 6, 7, 4, 3, 0] 

temp_b = [0]*20 

for i in b: 
    temp_b[i] = 1 

#to check whether each element of a is present in b or not 
for i in a: 
    if temp_b[i] == 1: 
     #element is present 
     print "present" 
    else: 
     #element is not present 
     print "not present" 

編輯:此方法只能用於正整數。

+0

如果'a'是'[1,2,3,4]'而'b'是'[1,2,3]''會怎麼樣?這不會導致「IndexError」?如果'a'是'[1,2,3,4]'而'b'是'[0,1,2,3]'?這不是說有零比賽,實際上有三個? – Kevin

+0

是的你是對的,也許我只是根據給定的價值來判斷你的問題。 – Shubham

0
a, b = [1, 2, 3], [2, 3, 1] 
for i in map(lambda i:i in b,a): 
    if i == True: 
     # do someting 
    else: 
     # do other 
+3

你應該嘗試解釋你的解決方案,而不是僅僅發佈代碼。 – samlev

+0

@Ketul如果你能解釋你的答案,這將是非常有用的 –

+0

這段代碼並不能讓你訪問'b'中'a'的當前元素,所以它的用處非常有限。稍微好一點就是'對於地圖上的標誌(lambda i:(i,i in b),a):''if flag:#do stuff with v'等 –