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

Python 查找列表中的任何元素是否在另一个列表中,并返回找到的第一个元素,python,python-2.7,Python,Python 2.7,使用any(),很容易检查列表中的一个元素是否在另一个列表中: 但是有没有一种惯用的方法返回找到的第一个元素呢 我更喜欢单线解决方案,而不是: for elem in list1: if elem in list2: return elem 是的,在进行列表理解时,可以使用过滤器: list1 = ['a', 'b', 'c', 'd', 'e'] list2 = ['g', 'z', 'b', 'd', '33'] [elem for elem in list1 if e

使用
any()
,很容易检查列表中的一个元素是否在另一个列表中:

但是有没有一种惯用的方法返回找到的第一个元素呢

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

for elem in list1:
   if elem in list2:
       return elem

是的,在进行列表理解时,可以使用过滤器:

list1 = ['a', 'b', 'c', 'd', 'e']
list2 = ['g', 'z', 'b', 'd', '33']
[elem for elem in list1 if elem in list2]
# ['b', 'd']
使用集合:

如果要使其成为类似于任何的条件:

if (set(list1) & set(list2)):
    do something

使用列表理解:

[elem for elem in list1 if elem in list2]
例如:

list1 = [1, 2, 3, 4, 5]
list2 = [1, 10, 2, 20]

c = [elem for elem in list1 if elem in list2]
print(c)
输出

[1, 2]
这样做:

[e代表a中的e,如果e代表b中的e]

这个答案类似于on,其中@jamylak与其他算法相比,更详细地介绍了结果计时

def intersect(a, b):
  return list(set(a) & set(b))

print intersect(b1, b2)
如果只需要匹配的第一个元素,请使用:

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

>>> b_set = set(b)
>>> next(element for element in a if element in b_set)
如果
next
未找到任何内容,则会引发异常:

>>> a = [4, 5]
>>> next(element for element in a if element in b_set)
Traceback (most recent call last):
StopIteration
您可以将其设置为默认返回,例如
None
。但是,这会更改解析函数参数的语法,您必须显式创建生成器表达式:

>>> None is next((element for element in a if element in b_set), None)
True

添加pop()以获取问题中的一项:
result=(set(list1)&set(list2))。pop()
当然,假设至少有一个公共元素,否则将引发一个键错误。result就是结果。如果两个列表中都有多个元素,则结果是多个元素。可能重复您想要的是所有匹配项,还是第一个匹配项?您的示例是第一个匹配项。如果您只想要第一个匹配项,它将是以下内容的副本:@M4rtini第二个链接(令人惊讶地)与使用类似,但有更多的细节和时间。我想知道这种相似性是否是因为它是惯用的。@PeterWood-我想要第一场比赛。如果没有找到任何东西,你可能想把关于return
None
的最后一部分归功于jamylak。我想你是从他那里得到启发的,因为编辑是在你对他的答案发表评论之后进行的?我确实想到了在阅读后无法找到元素的可能性。然而,他们自己并没有提到这一点,这是隐含的,他们也并没有扩展。我想我没有从答案中抄袭任何东西。我自己每天都在工作中使用这个成语,并没有从答案中学到它。
>>> b_set = set(b)
>>> next(element for element in a if element in b_set)
>>> a = [4, 5]
>>> next(element for element in a if element in b_set)
Traceback (most recent call last):
StopIteration
>>> None is next((element for element in a if element in b_set), None)
True