在条件满足之前迭代列表的最pythonic方法是什么?

时间:2015-03-10 16:53:41

标签: python list

我有一个真实值列表:

values = [0.1, 2.9, 1.4, 5.7, 9.2, 3.8]

我希望迭代的项目数量,直到满足某些条件。例如,如果条件为item > 5,则结果为3。

最简单的方法,也许最直接的方式是:

for index, item in enumerate(values):
    if (item > 5):
        print(index)
        break

还有其他方式更多pythonic,最好是单行,这样做吗?

4 个答案:

答案 0 :(得分:10)

您可以itertools.takewhile使用sum,这将使用元素,直到满足条件,使用我们懒惰评估的生成器表达式:

values = [0.1, 2.9, 1.4, 5.7, 9.2, 3.8]

from itertools import takewhile

print(sum(1 for _ in takewhile(lambda x: x< 5,values)))

答案 1 :(得分:4)

您的代码等效于以下生成器表达式

In [1]: gen = (i for i, v in enumerate(values) if v > 5)

next( gen )将返回第一个匹配元素的索引

In [2]: next(gen)
Out[2]: 3

或提升StopIteration(如果没有此类元素) - 如果这是一个问题,请考虑添加一些默认值,例如None

In [3]: next((i for i, v in enumerate(values) if v > 10), None) is None
Out[3]: True

或将itertools.takewhilesum一起使用(请注意,您需要否定谓词):

In [4]: import itertools

In [5]: it = itertools.takewhile(lambda x: x <= 5, values)

In [6]: sum(1 for _ in it)
Out[6]: 3

答案 2 :(得分:1)

对于名单,Padraic的回答!如果数据结构已经是数组,那么使用NumPy肯定是最快的......

In [370]: a = np.array(values)

In [371]: (a>5).argmax()
Out[371]: 3

答案 3 :(得分:0)

执行此操作的最pythonic方法是使用理解列表。

print next(ind for ind, i in enumerate([0.1, 2.9, 1.4, 5.7, 9.2, 3.8]) if i > 5)