【问题标题】:Continue the loop once the item meets a condition using a python generator一旦项目满足使用python生成器的条件,继续循环
【发布时间】:2021-02-22 21:19:00
【问题描述】:

我有一个随机数列表。我想优化列表,以便没有一对数字的乘积为 0.5。我正在尝试将next 方法用于python 生成器,以便在满足条件后立即继续循环。另一个原因是我想避免嵌套的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 错误。

那么我应该如何使用生成器继续循环呢?或者有更好的方法吗?

【问题讨论】:

    标签: python loops for-loop generator next


    【解决方案1】:

    问题出在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)
    

    【讨论】:

    • any 是否在找到满足条件的项目后继续循环,或者它是否还检查所有项目的条件,如all
    • @shuha918 它在第一次匹配时停止;)它利用了给定生成器的好处
    猜你喜欢
    • 2017-02-03
    • 2012-09-16
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2023-04-02
    • 2019-08-09
    相关资源
    最近更新 更多