查找列表中的任何元素是否在另一个列表中并返回找到的第一个元素

nlu*_*igi 7 python python-2.7

使用以下命令很容易检查列表的元素是否在另一个列表中any()

any(elem in list2 for elem in list1)
Run Code Online (Sandbox Code Playgroud)

但无论如何,有没有惯用的方式来返回找到的第一个元素?

我更喜欢单行解决方案,而不是:

for elem in list1:
   if elem in list2:
       return elem
Run Code Online (Sandbox Code Playgroud)

Ser*_*tar 6

使用集:https ://docs.python.org/2/library/sets.html

result = set(list1) & set(list2)
Run Code Online (Sandbox Code Playgroud)

如果你想让它像任何条件一样:

if (set(list1) & set(list2)):
    do something
Run Code Online (Sandbox Code Playgroud)

  • 添加 pop() 以获取一项,如问题所示:`result = (set(list1) & set(list2)).pop()` (2认同)

Pet*_*ood 2

这个答案与类似问题的答案类似,其中 @jamylak 更详细地介绍了与其他算法相比对结果进行计时的细节。

如果您只想匹配第一个元素,请使用next

>>> a = [1, 2, 3, 4, 5]
>>> b = [14, 17, 9, 3, 8]
>>> next(element for element in a if element in b)
3
Run Code Online (Sandbox Code Playgroud)

b这不是太有效,因为它对每个元素执行线性搜索。您可以创建一个set具有b更好查找性能的:

>>> b_set = set(b)
>>> next(element for element in a if element in b_set)
Run Code Online (Sandbox Code Playgroud)

如果next没有找到任何东西,则会引发异常:

>>> a = [4, 5]
>>> next(element for element in a if element in b_set)
Traceback (most recent call last):
StopIteration
Run Code Online (Sandbox Code Playgroud)

您可以给它一个默认值来代替,例如None。然而,这改变了函数参数解析方式的语法,您必须显式创建一个生成器表达式:

>>> None is next((element for element in a if element in b_set), None)
True
Run Code Online (Sandbox Code Playgroud)