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

时间:2016-01-28 09:53:14

标签: python python-2.7

使用any()

可以轻松检查列表中的元素是否在另一个列表中
any(elem in list2 for elem in list1)

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

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

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

6 个答案:

答案 0 :(得分:3)

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

result = set(list1) & set(list2)

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

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

答案 1 :(得分:2)

此答案类似于an answer上的a similar question,其中@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的线性搜索并不太有效。您可以从set创建一个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

答案 2 :(得分:1)

这样做:

[e for e in a if e in b]

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

使用列表理解:

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

答案 5 :(得分:0)

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

print intersect(b1, b2)