[英]How can I perform the following computation in a more elegant (and Pythonic) way?
[英]How to organize this loop in a more elegant Pythonic way
所以我有一个减少一些数据集的函数,并返回删除的元素数。 一旦在功能操作期间减少的项目数为零,我必须停止应用它。 目前我有这个:
num_removed = reduction_pass(dataset)
while num_removed > 0:
num_removed = reduction_pass(dataset)
但是这两个变量赋值给了我。 是否有更优雅的方式来写这个?
我假设你实际上并不需要最终的返回值,因为我认为它表示已删除元素的数量,在最后一次传递中显然总是为0。
简单易于复杂的方式:
while reduction_pass(dataset) > 0: pass
炫耀,显然不严肃的方式:
from itertools import *
list(takewhile(lambda x: x > 0, starmap(reduction_pass, repeat((dataset,)))))
你可以得到一个迭代器
it = iter(lambda: reduction_pass(dataset), 0)
在每一步,它调用给定的函数,并在检索到0时停止。
有了这个迭代器,你就可以做到
for num_removed in it:
do_whatever()
是的,Python不允许条件控制结构中的语句。 它有它的优点,它有它的缺点。
如果你发现两个var赋值很烦人,也许这样更好:
while True:
num_removed = reduction_pass(dataset)
if num_removed <= 0:
break
虽然一般我认为你不应该担心它太多。
对我来说最明显的方法是:
num_removed = None
while num_removed is None or num_removed > 0:
num_removed = reduction_pass(dataset)
一个带有中断的while
循环通常是最简单和最好的,但假设当你说num_removed > 0
时循环时你实际上可能意味着num_removed != 0
,这里是一个相当干净的选择:
for num_removed in iter(lambda: reduction_pass(dataset), 0):
pass
如果你真的需要num_removed
的中间值用于循环体内的某些东西,那当然才有意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.