首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在序列中找到与Python中的谓词匹配的第一个元素?

如何在序列中找到与Python中的谓词匹配的第一个元素?
EN

Stack Overflow用户
提问于 2012-10-17 07:08:58
回答 4查看 5.9K关注 0票数 4

可能重复: Python: find first element in a sequence that matches a predicate

Python标准库中是否有封装以下控制流模式的高阶函数?

代码语言:javascript
复制
>>> def find(pred, coll):
...   for x in coll:
...     if pred(x):
...       return x
... 
>>> find(lambda n : n % 2 == 0, [3, 5, 8, 9, 6])
8
>>> find(lambda n : n % 2 == 0, [3, 5, 7, 9, 6])
6
>>> find(lambda n : n % 2 == 0, [3, 5, 7, 9, 1])
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-17 07:11:37

您可以将ifilterislice组合起来,以获得第一个匹配元素。

代码语言:javascript
复制
>>> list(itertools.islice(itertools.ifilter(lambda n: n % 2 == 0, lst), 1))
[8]

但是,我不认为这比您发布的原始代码更易读或更好。不过,在一个函数中包装起来会好得多。由于next只返回一个元素,因此不再需要islice

代码语言:javascript
复制
def find(pred, iterable):
    return next(itertools.ifilter(pred, iterable), None)

如果没有找到元素,则返回None

但是,您仍然需要对谓词函数每一个循环进行相当慢的调用。请考虑使用列表理解或生成器表达式来代替:

代码语言:javascript
复制
>>> next((x for x in lst if x % 2 == 0), None)
8
票数 11
EN

Stack Overflow用户

发布于 2012-10-17 07:12:11

如果您只获取结果可迭代性的第一个元素,itertools.ifilter()就可以做到这一点。

代码语言:javascript
复制
itertools.ifilter(pred, col1).next()

类似地,生成器对象也可以这样做(同样,从结果生成器中删除第一项):

代码语言:javascript
复制
(i for i in col1 if i % 2 == 0).next()

因为这两个元素都是延迟计算的,所以您只需要计算输入可迭代性的多少,才能得到满足谓词的第一个元素。注意,如果没有匹配谓词,您将得到一个StopIteration异常。您可以通过使用next()内置程序来避免这种情况:

代码语言:javascript
复制
next((i for i in col1 if i % 2 == 0), None)
票数 4
EN

Stack Overflow用户

发布于 2012-10-17 07:16:10

我不知道这样的函数在我的头上,但你可以只用一个生成器表达式,并取得第一个结果。

代码语言:javascript
复制
x = (x for x in [3,5,8,9,6] if (lambda n: n % 2 == 0)(x))
y = x.next()

或者只是

代码语言:javascript
复制
y = (x for x in [3,5,8,9,6] if (lambda n: n % 2 == 0)(x)).next()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12928946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档