2012-12-16 86 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更快的优化。然而,将列表转换为集合会带来一些开销,因此可能不值得付出努力。

相关问题