使用 python 生成器在项目满足条件后继续循环
Continue the loop once the item meets a condition using a python generator
我有一个随机数列表。我想细化列表,以便没有一对数字的乘积为 0.5。我正在尝试对 python 生成器使用 next
方法,以便在满足条件后立即继续循环。另一个原因是我想避免嵌套的for循环,这样代码可以在满足条件时继续主循环。
值得注意的是,在我的真实案例中,检查条件的计算成本非常高,这就是我想使用生成器的原因,这样我就可以在条件满足时立即继续循环,而不是使用 refined_list
中所有当前存在的数字检查条件。这里我只是以一个简单的条件i * j == 0.5
为例。
下面是我的代码
import random
rands = [random.uniform(0,1) for _ in range(100)]
refined_list = []
for i in rands:
if refined_list: # Make sure the refined list is not empty
if next(j for j in refined_list if i * j == 0.5):
continue
refined_list.append(i)
print(refined_list)
但是,一旦满足条件,我就会收到 StopIteration
错误。
那么我应该如何使用生成器继续循环?或者有更好的方法吗?
问题出在next
本身,要么你的条件为真,要么引发异常
您可以使用any
for i in rands:
if refined_list: # Make sure the refined list is not empty
if any(j for j in refined_list if i * j == 0.5):
continue
refined_list.append(i)
您可以重构条件以对条件进行分组,然后得到
for i in rands:
if not (refined_list and any(j for j in refined_list if i * j == 0.5)):
refined_list.append(i)
我有一个随机数列表。我想细化列表,以便没有一对数字的乘积为 0.5。我正在尝试对 python 生成器使用 next
方法,以便在满足条件后立即继续循环。另一个原因是我想避免嵌套的for循环,这样代码可以在满足条件时继续主循环。
值得注意的是,在我的真实案例中,检查条件的计算成本非常高,这就是我想使用生成器的原因,这样我就可以在条件满足时立即继续循环,而不是使用 refined_list
中所有当前存在的数字检查条件。这里我只是以一个简单的条件i * j == 0.5
为例。
下面是我的代码
import random
rands = [random.uniform(0,1) for _ in range(100)]
refined_list = []
for i in rands:
if refined_list: # Make sure the refined list is not empty
if next(j for j in refined_list if i * j == 0.5):
continue
refined_list.append(i)
print(refined_list)
但是,一旦满足条件,我就会收到 StopIteration
错误。
那么我应该如何使用生成器继续循环?或者有更好的方法吗?
问题出在next
本身,要么你的条件为真,要么引发异常
您可以使用any
for i in rands:
if refined_list: # Make sure the refined list is not empty
if any(j for j in refined_list if i * j == 0.5):
continue
refined_list.append(i)
您可以重构条件以对条件进行分组,然后得到
for i in rands:
if not (refined_list and any(j for j in refined_list if i * j == 0.5)):
refined_list.append(i)