2013-02-28 43 views
14

我有兩個列表說如何檢查列表中的所有項目是否在另一個列表中?

List1 = ['a','c','c'] 
List2 = ['x','b','a','x','c','y','c'] 

現在我想看看列表1中的所有元素在列表2在那裏。在這種情況下,所有的都有。我不能使用子集函數,因爲我可以在列表中重複元素。我可以使用for循環來計算List1中每個項目的出現次數,並查看它是否小於或等於List2中出現的次數。有一個更好的方法嗎?

謝謝。

回答

25

你仍然可以使用子集功能,通過動態創建一組:

>>> list1 = ['a', 'c', 'c'] 
>>> list2 = ['x', 'b', 'a', 'x', 'c', 'y', 'c'] 
>>> set(list1) < set(list2) 
True 

或者,如果你想檢查是否符合出現次數的數量,你可以使用計數器類型和定義你自己的子集關係:

>>> from collections import Counter 
>>> def counterSubset(list1, list2): 
     c1, c2 = Counter(list1), Counter(list2) 
     for k, n in c1.items(): 
      if n > c2[k]: 
       return False 
     return True 

>>> counterSubset(list1, list2) 
True 
>>> counterSubset(list1 + ['a'], list2) 
False 
>>> counterSubset(list1 + ['z'], list2) 
False 

如果你已經有計數器(這可能是反正你存儲數據的有用的替代),你也可以只寫此爲單行:

>>> all(n <= c2[k] for k, n in c1.items()) 
True 
+0

嗨,第二部分是我想要做的。看起來這是唯一的出路。謝謝! – pogo 2013-02-28 23:58:14

+0

在['s','e','r','','','','y']和'['','','','y' ]' – SIslam 2016-01-25 14:53:57

+0

@SIslam取決於訂單。第二個列表是前一個列表的一個子集,所以我的答案中的解決方案將正確識別它。 – poke 2016-01-25 14:58:48

0

這將返回true是List1中所有的物品都在列表2

def list1InList2(list1, list2): 
    for item in list1: 
     if item not in list2: 
      return False 
    return True 
+1

我不是downvoter,但你應該看看[PEP 8](http://www.python.org/dev/peps/pep-0008/)。你的'if'語法關閉了,你有一個不需要的分號,你的變量命名風格應該保留給類。 – 2013-03-01 00:23:26

+1

此外,這可以簡化爲一行:'all(List1中的項目List1中的項目)''。 – 2013-03-01 00:26:03

+0

我使用List1和List2作爲變量名稱,因爲這是問題中的內容,並且自從我使用python以來,我已經有一段時間了,所以我會承認圍繞if的分號和括號是不好的 – jeffam217 2013-03-01 03:08:17

1
def check_subset(list1, list2): 
    try: 
     [list2.remove(x) for x in list1] 
     return 'all elements in list1 are in list2' 
    except: 
     return 'some elements in list1 are not in list2' 
2

要注意以下問題:

>>>listA = ['a', 'a', 'b','b','b','c'] 
>>>listB = ['b', 'a','a','b','c','d'] 
>>>all(item in listB for item in listA) 
True 

如果你讀了「所有」行,你會用英文,這是沒有錯的,但可能會誤導,因爲listA有第三個'b',但listB沒有。

這也有同樣的問題:

def list1InList2(list1, list2): 
    for item in list1: 
     if item not in list2: 
      return False 
    return True 

剛一說明。以下不起作用:

>>>tupA = (1,2,3,4,5,6,7,8,9) 
>>>tupB = (1,2,3,4,5,6,6,7,8,9) 
>>>set(tupA) < set(TupB) 
False 

如果將元組轉換爲列表,它仍然不起作用。我不知道爲什麼字符串可以工作,但是整數不能。

作品,但有不守元occurances的計數的同一個問題:

>>>set(tupA).issubset(set(tupB)) 
True 

使用套是不是多occurrance元件匹配的全面解決方案。

但這裏是一個班輪解決方案/適應於shantanoo的回答沒有的try /除外:

all(True if sequenceA.count(item) <= sequenceB.count(item) else False for item in sequenceA) 

內置函數使用三元條件操作包裝列表理解。 Python真棒!請注意,「< =」不應該是「==」。

使用此解決方案序列A和B可以是類型元組和列表以及其他具有「count」方法的「序列」。兩個序列中的元素可以是大多數類型。我不會像現在這樣在字典中使用它,因此使用「sequence」而不是「iterable」。

相關問題