Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么是迭代列表直到满足条件的最适合的方法?_Python_List - Fatal编程技术网

Python 什么是迭代列表直到满足条件的最适合的方法?

Python 什么是迭代列表直到满足条件的最适合的方法?,python,list,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(最好是一个liner)功能的方法可以做到这一点

我有一份真实价值清单:

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(最好是一个liner)功能的方法可以做到这一点?

您可以使用
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)))
value=[0.1,2.9,1.4,5.7,9.2,3.8]
从itertools导入takewhile
打印(总和(1表示takewhile中的λx:x<5,值)))

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

In [1]: gen = (i for i, v in enumerate(values) if v > 5)
gen)
将返回第一个匹配元素的索引

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

或抬起<代码>停止迭代< /代码>(如果没有这样的元素)——如果这是一个问题,请考虑添加一些缺省值,例如:g代码>没有< /代码>:

In [3]: next((i for i, v in enumerate(values) if v > 10), None) is None
Out[3]: True
或者使用with(请注意,您需要否定谓词):

[4]中的
:导入itertools

在[5]中:it=itertools.takewhile(lambda x:x对于列表,Padraic的答案!如果数据结构已经是数组,那么使用NumPy肯定是最快的

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

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

要做到这一点,最好的方法是使用理解列表

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

你为什么想要一个单行程序?你所拥有的是非常清楚的,并且做了你想要它做的事情。单行程序不是我想要的,但我不会介意。上面的方法是标准的过程。我觉得必须有一种方法使它更简洁、简洁;类似于python中的列表理解能力。这不会产生预期的效果结果(3)。我不希望元素总数满足某些条件。我想我在问题中已经讲得很清楚了。@wflynny那只是一个理解列表的示例。我用正确的代码更新了这个问题的答案。谢谢。我不能说代码更清晰,但无论如何它是简洁的。不过,就效率而言如果我们有一个非常大的列表,那么它不需要很多函数调用吗?@skuzzy,你是说速度还是内存?@Padraic两者都有。我相信,懒惰的计算保证了比其他解决方案更好的内存效率。但是速度?这个幼稚的解决方案(在我的问题中)没有任何内存或性能开销。@skuzzy,是的,生成器比简单循环的开销更大,这是空间与时间之间的权衡。如果您希望在速度方面获得最有效的解决方案,那么您的简单循环几乎肯定是最有效率的。除非您多次运行代码,并且列表是无效的ry非常大,那么任何解决方案都不会引起许多实际问题。
print next(ind for ind, i in enumerate([0.1, 2.9, 1.4, 5.7, 9.2, 3.8]) if i > 5)