微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从匹配条件的迭代中获取第一个项目

如何解决从匹配条件的迭代中获取第一个项目

Python 2.6+ 和 Python 3:

如果您想stopiteration在没有找到匹配元素的情况下被提升:

next(x for x in the_iterable if x > 3)

如果您希望default_value(例如None)被退回:

next((x for x in the_iterable if x > 3), default_value)

请注意,在这种情况下,您需要在生成器表达式周围添加一对额外的括号——只要生成器表达式不是唯一的参数,就需要它们。

我看到大多数答案都坚决地忽略了next内置的,所以我假设出于某种神秘的原因,他们 100% 专注于 2.5 版和更早的版本——没有提到 Python 版本问题(但我在 确实 提到内置的答案next,这就是为什么我认为有必要自己提供答案 - 至少“正确版本”问题以这种方式记录在案;-)。

Python <= 2.5

如果迭代器立即完成,迭代器的.next()方法会立即引发stopiteration- 即,对于您的用例,如果可迭代对象中没有项目满足条件。如果您不关心(即,您知道 至少有一个令人满意的项目),那么只需使用.next()(最好在 genexp 上,用于nextPython 2.6 和更好的内置行)。

如果您 确实 在意,最好按照您在 Q 中首先指出的那样将内容包装在一个函数中,虽然您提出的函数实现很好,但您也可以使用itertoolsfor...: break循环或 genexp 或 atry/except stopiteration作为函数的主体,正如各种答案所建议的那样。这些替代方案中的任何一个都没有太多附加值,因此我会选择您最初提出的极其简单的版本。

解决方法

我想从匹配条件的列表中获取第一项。生成的方法不处理可能非常大的整个列表,这一点很重要。例如,以下函数就足够了:

def first(the_iterable,condition = lambda x: True):
    for i in the_iterable:
        if condition(i):
            return i

这个函数可以像这样使用:

>>> first(range(10))
0
>>> first(range(10),lambda i: i > 3)
4

但是,我想不出一个好的内置/单线让我这样做。如果不需要的话,我并不特别想复制这个功能。有没有一种内置的方法来获取第一个匹配条件的项目?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。