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-我想要第一场比赛。如果没有找到任何东西,你可能想把关于returnNone
的最后一部分归功于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