从迭代匹配条件获取第一个项目的最佳方式是什么?

问题:

在Python中,我想从匹配条件的列表中获取第一个项目。例如,以下功能是足够的:

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

但是,我不能想到一个很好的内置/一线让我这样做(我不是特别想复制这个功能,如果我不必)。有任何想法吗?
(重要的是,生成的方法不会处理整个列表,这可能非常大。)

回答:

在Python 2.6或更好的版本中:
如果您想要找不到匹配元素的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版本的问题(但是我看不到在答案中提到do提到next内置,这就是为什么我认为有必要提供一个答案 – 至少“正确的版本”问题以这种方式记录下来;-)。
在2.5中,如果迭代器立即完成,迭代器的.next()方法立即引发StopIteration,即对于您的用例,如果iterable中的项目不满足条件。如果你不在乎(也就是说,你知道必须至少有一个令人满意的项目),那么只需使用.next()(最好在genexp中,Python 2.6中内置的next行更好)。
如果你do关心,在你的Q中首先表示的功能中包装的东西似乎是最好的,而你提出的功能实现是很好的,你可以选择使用itertoolsfor...: break循环或genexp或try/except StopIteration作为功能的身体,因为各种答案建议。任何这些替代品都没有太多的附加值,所以我会去你最初提出的一个简单的版本。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: What is the best way to get the first item from an iterable matching a condition?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 46 = 56