繁体   English   中英

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

[英]Finding if any element in a list is in another list and return the first element found

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

any(elem in list2 for elem in list1)

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

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

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

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

result = set(list1) & set(list2)

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

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

这个答案类似于类似问题 的答案 ,其中@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

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

>>> 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

这样做:

[e for e in a if e in b]

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

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

使用列表理解:

[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]
def intersect(a, b):
  return list(set(a) & set(b))

print intersect(b1, b2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM