2012-12-16 85 views
-3

我有兩個列表。我需要編寫一個函數detect如果列表中的項目a在列表b中

一個「在list_a項目」循環檢查是否在list_b存在的項目。

我該如何去做這件事? 如果沒有適當的關鍵字,我找不到任何東西!

list_a = ["Q", "W", "E"] 
list_b = ["Q", "D", "E"] 

def detect(item): 
    return 

detect(list_a[0]) 
>>True 
detect(list_a[1]) 
>>False 

我曾嘗試:

for item in list_a: 
    if item in list_b: 
     return True 
    else: 
     return False 
+0

不明白你在問什麼。你想知道兩個列表中的哪些項目在兩個列表中? –

+0

你是否被1?列表有一個從0開始的索引 –

回答

2

要檢查的項目是否在列表中,您都可以使用in操作: -

"Q" in ["Q", "W", "R"] 
>> True 

現在,每個項目在list_a中,檢查是否在list_b之內。這會給你想要的結果。

6
>>> set_b = set(["Q", "D", "E"]) 
>>> set_a = set(["Q", "W", "E"]) 
>>> set_a.intersection(set_b) 
set(['Q', 'E']) 
>>> 'Q' in set_a.intersection(set_b) 
True 
>>> '42' in set_a.intersection(set_b) 
False 
+1

當它是一個集合時,稱它爲'list_a'有點混亂! (但我同意,套是這樣做的) –

+2

這是一個很好的解決方案,但我有我的保留關於存儲項目集,有時列表包含多個相同的項目爲特定的原因,我想如果你是將整個事件封裝成一個接收兩個列表的函數,並將它們的交集也作爲列表返回 - 這將是一個更加安撫的答案。 –

1

你試過的是幾乎正確的。這裏有一個修正版本:

def detect(item, list_a, list_b): 
    for item in list_a: 
     if item in list_b: 
      return True 
    return False # not found 

與您的版本的問題是,它只是檢查的第一項list_a和返回無論是TrueFalse值。修改後的版本會一直持續,直到找到兩個列表中的某個內容爲止,或者僅在檢查第一個列表中的所有內容後才返回False

如果你要調用的函數有很多,可以通過創建和使用set!而非名單的一個或兩個,因爲in運營商工作在一個set比在list更快的優化。然而,將列表轉換爲集合會帶來一些開銷,因此可能不值得付出努力。

相關問題