什么是Pythonic(2.7,3)编写一个带有早期停止条件的for循环的方法?
例如
for item in lst:
if not condition(item):
break
process(item)
答案 0 :(得分:2)
你的方式看起来很棒!我通常会写:
for i in lst:
if i > k:
break
process(i)
(不需要显式索引)。或者,如果你感到饥饿:
map(process, it.takewhile(lambda i: i < k, lst))
答案 1 :(得分:2)
您可以使用itertools.takewhile
:
from itertools import takewhile
for item in takewhile(condition, lst):
process(item)
来自文档:
itertools.takewhile(predicate, iterable)
只要谓词为真,就创建一个从迭代中返回元素的迭代器。
要查找您的公共前缀,例如:
def common_prefix(s1, s2):
return "".join(a for a, _ in takewhile(lambda t: t[0] == t[1], zip(s1, s2)))
答案 2 :(得分:0)
默认答案:已经写好的方式。
for item in lst:
if not condition(item):
break
process(item)
答案 3 :(得分:0)
尝试建立一种新的列表理解语法,其中包含takewhile
的概念。
在这种格式中,代码可以写成[列表理解的可怕方式,如没有值的单行迭代,由于害怕易受影响的头脑中的附带损害,因此不会在答案中给出]。
对于“两个字符串的公共前缀”的问题,我们有这样的事情:
def commonprefix(s1, s2):
return ''.join(x for x, y in zip(s1, s2) while x==y)
不幸的是,似乎这些尝试无法得到任何令人满意的结果:http://stupidpythonideas.blogspot.com/2013/07/syntactic-takewhile.html