写一篇「;“暂时”;Python中的循环
什么是Pythonic(2.7,3)方式来编写一个for循环,并带有提前停止的条件 比如说写一篇「;“暂时”;Python中的循环,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,什么是Pythonic(2.7,3)方式来编写一个for循环,并带有提前停止的条件 比如说 for item in lst: if not condition(item): break process(item) 默认答案:它的书写方式 for item in lst: if not condition(item): break process(item) 默认答案:它的书写方式 for item in lst: if
for item in lst:
if not condition(item):
break
process(item)
默认答案:它的书写方式
for item in lst:
if not condition(item):
break
process(item)
默认答案:它的书写方式
for item in lst:
if not condition(item):
break
process(item)
你的方式看起来很棒!我通常会这样写:
for i in lst:
if i > k:
break
process(i)
(不需要显式索引)。或者如果你觉得饿了:
map(process, it.takewhile(lambda i: i < k, lst))
map(进程,it.takewhile(lambda i:i
你的方式看起来很棒!我通常会这样写:
for i in lst:
if i > k:
break
process(i)
(不需要显式索引)。或者如果你觉得饿了:
map(process, it.takewhile(lambda i: i < k, lst))
map(进程,it.takewhile(lambda i:i
您可以使用:
从文件中:
itertools.takewhile(谓词,iterable)
生成一个迭代器,只要谓词为true,它就会从iterable返回元素
要查找通用前缀,例如:
def common_prefix(s1, s2):
return "".join(a for a, _ in takewhile(lambda t: t[0] == t[1], zip(s1, s2)))
您可以使用:
从文件中:
itertools.takewhile(谓词,iterable)
生成一个迭代器,只要谓词为true,它就会从iterable返回元素
要查找通用前缀,例如:
def common_prefix(s1, s2):
return "".join(a for a, _ in takewhile(lambda t: t[0] == t[1], zip(s1, s2)))
有人试图建立一种新的列表理解语法,该语法结合了
takewhile
的思想
在这种格式下,代码可以写成[糟糕的列表理解方式,一行迭代,没有价值,答案本身不会给出,因为担心易受影响的头脑会受到附带损害]
对于“两个字符串的公共前缀”问题,我们有如下内容:
def commonprefix(s1, s2):
return ''.join(x for x, y in zip(s1, s2) while x==y)
不幸的是,这些尝试似乎没有得到任何令人满意的结果:有人试图为列表理解建立一种新的语法,其中包含了
takewhile
的思想
在这种格式下,代码可以写成[糟糕的列表理解方式,一行迭代,没有价值,答案本身不会给出,因为担心易受影响的头脑会受到附带损害]
对于“两个字符串的公共前缀”问题,我们有如下内容:
def commonprefix(s1, s2):
return ''.join(x for x, y in zip(s1, s2) while x==y)
不幸的是,这些尝试似乎没有得到任何令人满意的结果:我不想解决一个特定的问题。这不是很有帮助。正确的方法取决于是否要处理所有项
,最初的问题是查找两个字符串的公共前缀的长度。您可以使用os.path.commonprefix
,但它让我想知道如何尽早停止for
循环。如果您想知道的话,上面的代码没有bug(以那种方式);我编辑了我的答案,以演示如何使用itertools
中的takewhile
实现此目的。我不想解决特定问题。这并没有太大帮助。正确的方法取决于是否要处理所有项,最初的问题是查找两个字符串的公共前缀的长度。您可以使用os.path.commonprefix
,但它让我想知道如何尽早停止for
循环。如果您想知道的话,上面的代码没有bug(以那种方式);我已经编辑了我的答案,以演示如何使用itertools
中的takewhile
实现此目的。过滤方式不会在第一次失败时停止。过滤方式不会在第一次失败时停止。迭代(我假设是)n=len(lst)
;直接迭代lst
,或者如果实际需要索引,则迭代枚举它。n
可能已预先计算为一个界限。我并不是说问题是关于一个实际的列表,尽管这是我的错。然后你可以做:对于索引,枚举中的项(无论什么):if index>bound或condition(item):break;流程(项目)
。如果len(无论什么)
,这个就不会坏。我知道。我想举个简单的例子。我简化了示例并更新了问题。迭代(我假设的是)n=len(lst)
;直接迭代lst
,或者如果实际需要索引,则迭代枚举它。n
可能已预先计算为一个界限。我并不是说问题是关于一个实际的列表,尽管这是我的错。然后你可以做:对于索引,枚举中的项(无论什么):if index>bound或condition(item):break;流程(项目)
。如果len(无论什么)
,这个就不会坏。我知道。我想举个简单的例子。我简化了示例并更新了问题。看起来不错,但似乎您在列表理解中缺少了您的[]
。在功能状态下,我可能更喜欢返回s1[:len(list(itertools.takewhile(operator.eq,s1,s2))]
,尽管takewhile不幸地没有接受多个iterables。我必须仔细阅读论证展开式。@Victory,这是一个生成器表达式。如果genexp是唯一的参数,那么它不需要参数。@leewangzhong-很有趣,那么为什么打印“”。如果a<4,那么join(a代表xrange(3)中的a)
抛出一个TypeError
?我看不出lambda如何接受两个参数。在Python 3中应该是lambda(a,b):
和lambda-pair:pair[0]==pair[1]
?看起来不错,但在列表理解中似乎缺少了[]
。在函数式的气氛中,我可能更喜欢返回s1[:len(list(itertools.takewhile(operator.eq,s1,s2))]
,尽管takewhile不幸地不接受多个iterables。我必须仔细阅读论证展开式。@Victory,这是一个生成器表达式。如果genexp是唯一的参数,那么它不需要参数。@leewangzhong-很有趣,那么为什么打印“”。如果a<4,那么join(a代表xrange(3)中的a)
抛出一个TypeError
?我看不出lambda如何接受两个参数。应该是lambda(a,b):
和lamb