2013-04-22 110 views
32

我想比較兩個列表,並簡單地打印出一條消息,如果從第一列表中的任何值是在第二個列表。檢查是否在一個列表中的所有元素都在另一個

def listCompare(): 
    list1 = [1, 2, 3, 4, 5] 
    list2 = [5, 6, 7, 8, 9] 
    if list1 in list2: 
    print("Number was found") 
    else: 
    print("Number not in list") 

在這個例子中,我希望if評估,以True因爲5是在兩個列表。這不起作用,我不確定比較這兩個列表的最簡單方法。

+0

我已經採取了兩個動作就這個問題:我修改,以澄清什麼是問題的明顯原點的問題:確定在一個列表中的任何值是另一個列表。我相信這是給出問題地址的最佳答案的原始意圖,並且@ h1h1選擇瞭解決該問題的答案。 h1h1多年來一直沒有出現,所以我不能要求他或她澄清。所採取的第二項行動是,在對「確定一個列表中的所有元素是否在第二個列表中」進行中途修改之前,將所接受的答案恢復爲其狀態。 – 2017-02-03 17:18:57

回答

64

你可以解決這個許多方面。一個很容易理解的就是使用一個循環。

你可以做到這一點
def comp(list1, list2): 
    for val in list1: 
     if val in list2: 
      return True 
    return False 

一個更爲簡潔的方法是使用mapreduce

reduce(lambda v1,v2: v1 or v2, map(lambda v: v in list2, list1)) 

更妙的是,reduce可以用any取代:

any(map(lambda v: v in list2, list1)) 

你也可以使用裝置:

len(set(list1).intersection(list2)) > 0 
+0

感謝大衛的幫助! – h1h1 2013-04-22 01:27:01

+4

第一個版本不起作用(當兩個列表中只有一個值時,不僅當兩個列表中的所有值都爲真) – thias 2013-08-16 11:49:23

+2

第一種方法是錯誤的。它是從list1到list2的比較。必須從兩個角度執行基於循環的比較,包括從list2到list1。例如:對於list2中的val:...如果val在list1中......等等。另外,如果在list2上找到第一個值,則返回True,這意味着它不會繼續比較所有值。內部if語句應該是(如果val不在list2中:返回False),這意味着它會繼續,直到從第一個元素到最後一個元素都有正確的值。 – gextra 2014-01-26 14:41:49

14

有不同的方式。如果你只是想檢查,如果一個列表包含其他列表中的任何元素,你可以做到這一點..

not set(list1).isdisjoint(list2) 

我相信使用isdisjointintersection爲Python 2.6及以上更好。

8

你原來的做法可以用一個列表理解的工作:

def listCompare(): 
    list1 = [1, 2, 3, 4, 5] 
    list2 = [5, 6, 7, 8, 9] 
    if [item for item in list1 if item in list2]: 
    print("Number was found") 
    else: 
    print("Number not in list") 
9

有一個內置的功能比較表:

以下爲CMP的語法()方法 -

cmp(list1, list2) 

#!/usr/bin/python 

list1, list2 = [123, 'xyz'], [123, 'xyz'] 

print cmp(list1,list2) 

當運行上述程序,它產生以下結果 -

0 

如果結果是平局,這意味着返回0

+0

這不回答這個問題。 OP想知道在兩個列表中是否找到相同的值。 – Martin 2015-05-12 07:54:35

6

你可以列表改爲集,然後使用&功能比較兩組。例如:

list1 = [1, 2, 3, 4, 5] 
list2 = [5, 6, 7, 8, 9] 

if set(list1) & set(list2): 
    print "Number was found" 
else: 
    print "Number not in list" 

「&」運算符給出兩組之間的交點。如果有交叉點,將返回一個包含相交點的集合。如果沒有相交點,則返回空集。

當您在Python中使用「if」運算符評估空set/list/dict/tuple時,將返回布爾False。

1

我在我的一個項目中寫了下面的代碼。它基本上比較列表中的每個單獨元素。隨意使用它,如果它符合你的要求。

def reachedGoal(a,b): 
    if(len(a)!=len(b)): 
     raise ValueError("Wrong lists provided") 

    for val1 in range(0,len(a)): 
     temp1=a[val1] 
     temp2=b[val1] 
     for val2 in range(0,len(b)): 
      if(temp1[val2]!=temp2[val2]): 
       return False 
    return True 
相關問題