我有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
我覺得這個實現有點微不足道。
我想知道其他有效完成任務的方法。
(效率意味着無論是時間複雜度和空間複雜度)
我有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
我覺得這個實現有點微不足道。
我想知道其他有效完成任務的方法。
(效率意味着無論是時間複雜度和空間複雜度)
您可以使用組找到a
和b
的共同元素。
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)。
我們可以使用臨時數組來檢查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"
編輯:此方法只能用於正整數。
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
你應該嘗試解釋你的解決方案,而不是僅僅發佈代碼。 – samlev
@Ketul如果你能解釋你的答案,這將是非常有用的 –
這段代碼並不能讓你訪問'b'中'a'的當前元素,所以它的用處非常有限。稍微好一點就是'對於地圖上的標誌(lambda i:(i,i in b),a):''if flag:#do stuff with v'等 –
謝謝。我很感謝你的解決方案,但我無法將列表轉換爲集合。我只能使用列表 –
@KshitijSaraogi:爲什麼你不能使用集?你在使用Python的_really_舊版本嗎?如果你不能使用集合,那麼你堅持使用O(n^2)算法......除非你實現自己的散列表,而這個散列表將以Python速度運行緩慢,而不是你使用Python獲得的C速度組。 –
@ PM2Ring我正在處理一些對象的列表,我想在其他幾個地方使用這些列表。此外,我個人不喜歡類型鑄造的操作。 –