避免嵌套 for 循环 python

2023-12-01

我有一个函数,它接受表达式并用我用作输入的值的所有排列替换变量。这是我已经测试过并且可以工作的代码,但是在查看了 SO 之后,人们说嵌套 for 循环是一个坏主意,但是我不确定如何提高效率。有人可以帮忙吗?谢谢。

def replaceVar(expression):

    eval_list = list()

    a = [1, 8, 12, 13]
    b = [1, 2, 3, 4]
    c = [5, 9, 2, 7]

    for i in expression:
        first_eval = [i.replace("a", str(j)) for j in a]
        tmp = list()
        for k in first_eval:
            snd_eval = [k.replace("b", str(l)) for l in b]
            tmp2 = list()
            for m in snd_eval:
                trd_eval = [m.replace("c", str(n)) for n in c]
                tmp2.append(trd_eval)
            tmp.append(tmp2)
        eval_list.append(tmp)
    print(eval_list)
    return eval_list

print(replaceVar(['b-16+(c-(a+11))', 'a-(c-5)+a-b-10']))

Foreword

嵌套循环本身并不是一件坏事。它们只有在用于解决已找到更好算法的问题时才是坏的(就输入大小的效率而言,有好有坏)。例如,对整数列表进行排序就是这样一个问题。

分析问题

The size

在上面的例子中,您有三个列表,大小均为 4。如果 a 始终位于 b 之前且 b 始终位于 c 之前,则这将产生 4 * 4 * 4 = 64 种可能的组合。所以你至少需要 64 次迭代!

你的方法

在您的方法中,我们对 a 的每个可能值进行 4 次迭代,对 b 的每个可能值进行 4 次迭代,对 c 进行同样的迭代。所以我们总共有 4 * 4 * 4 = 64 次迭代。所以事实上你的解决方案非常好! 由于没有更快的方法来收听所有组合,因此您的方法也是最好的方法。

样式

关于样式,可以说您可以通过更好的变量名称和组合一些 for 循环来改进代码。例如。像那样:

def replaceVar(expressions):
    """
    Takes a list of expressions and returns a list of expressions with
    evaluated variables.
    """
    evaluatedExpressions = list()

    valuesOfA = [1, 8, 12, 13]
    valuesOfB = [1, 2, 3, 4]
    valuesOfC = [5, 9, 2, 7]

    for expression in expressions:
        for valueOfA in valuesOfA:
            for valueOfB in valuesOfB:
                for valueOfC in valuesOfC:
                    newExpression = expression.\
                                    replace('a', str(valueOfA)).\
                                    replace('b', str(valueOfB)).\
                                    replace('c', str(valueOfC))
                    evaluatedExpressions.append(newExpression)

    print(evaluatedExpressions)
    return evaluatedExpressions

print(replaceVar(['b-16+(c-(a+11))', 'a-(c-5)+a-b-10']))

但请注意,迭代次数保持不变!

迭代工具

As Kevin注意到,你也可以使用itertools生成笛卡尔积。在内部,它将执行与组合 for 循环相同的操作:

import itertools

def replaceVar(expressions):
    """
    Takes a list of expressions and returns a list of expressions with
    evaluated variables.
    """
    evaluatedExpressions = list()

    valuesOfA = [1, 8, 12, 13]
    valuesOfB = [1, 2, 3, 4]
    valuesOfC = [5, 9, 2, 7]

    for expression in expressions:
        for values in itertools.product(valuesOfA, valuesOfB, valuesOfC):
            valueOfA = values[0]
            valueOfB = values[1]
            valueOfC = values[2]
            newExpression = expression.\
                            replace('a', str(valueOfA)).\
                            replace('b', str(valueOfB)).\
                            replace('c', str(valueOfC))
            evaluatedExpressions.append(newExpression)

    print(evaluatedExpressions)
    return evaluatedExpressions

print(replaceVar(['b-16+(c-(a+11))', 'a-(c-5)+a-b-10']))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

避免嵌套 for 循环 python 的相关文章

随机推荐

  • 如何更快地读取/遍历/切片 Scipy 稀疏矩阵(LIL、CSR、COO、DOK)?

    为了操作 Scipy 矩阵 通常使用内置方法 但有时您需要读取矩阵数据以将其分配给非稀疏数据类型 为了演示 我创建了一个随机 LIL 稀疏矩阵 并使用不同的方法将其转换为 Numpy 数组 纯 Python 数据类型会更有意义 from f
  • 在 Websphere 中跟踪 HTTP 请求

    我有以下要求 我想跟踪通过我们的 WebSphere 服务器的所有请求 我们有一些 Web 应用程序和一些 Web 服务部署到我们的服务器上 但是 我不想将跟踪机制添加到每个应用程序中 是否有可能添加一些插件或为WebSphere服务器创建
  • Python:实时或从 wav 文件获取音量分贝级别

    对于项目工作 我需要从录制的音频文件或使用麦克风实时录制来测量音量 经过初步研究 我尝试使用声音文件库 该文件是使用 soundfile 读取的并使用20 np log10 np sqrt np mean np absolute a 2 我
  • 为什么添加 float 属性会使我的 div 表现得像内联块?

    我有两个 div 有两个主要属性显示块和宽度 block1 display block width 20 background color red height 100px block2 display block width 70 bac
  • 查找圆与矩形碰撞的碰撞边时出现问题

    我发现了一个非常适合检测圆形和矩形之间的碰撞以及找到接触点的函数 然后 我使用该点来确定圆击中矩形的哪一侧 以便我可以反映圆 但是 当圆心位于矩形内部时 该函数会将最近的点作为圆心 并将其处理为击中顶点而不是边 这是我的代码 def col
  • PyCharm 5.0.1 无法解析内置模块/方法

    我的 PyCharm 5 0 1 安装无法解析对任何内置模块或方法的引用 正如你所看到的 我已经通过 cygwin 安装了 python 我已经尝试过 重新安装 更新 python 安装 从 2 7 9 到 2 7 10 重新安装pycha
  • 协议符合具有关联值的类型

    我有以下片段 protocol MyProtocol Identifiable where ID UUID var id UUID get var test MyProtocol 协议 MyProtocol 只能用作通用约束 因为它具有 S
  • 如何获取 PHP 关联数组索引的智能感知? [复制]

    这个问题在这里已经有答案了 可能的重复 PHPDoc 用于可变长度参数数组 每当我打字时 SERVER 并按 Ctrl 空格键 它会给我可能的索引列表 我怎样才能使我创建的数组成为可能 代码完成为 SERVER为您提供有关人们从该关联数组中
  • 获取 Google Static Maps API 的西南角和东北角

    我在 Unity 应用程序中获取 Google 静态地图的边界时遇到问题 我已经尝试了在 stackoverflow 上找到的多个答案 NET相关问题 Javascript相关问题 我试图计算角点的地图是this one 首先我尝试翻译ma
  • 从驱动程序代码设置设备权限失败

    我想从 Linux 内核 3 10 14 中的用户空间访问 I2C 设备驱动程序节点 我在内核配置中添加了 i2c dev 并获得了 dev i2c 设备节点 然而他们有许可 ls l dev i2c crw root root 89 1
  • 定义 JSON 结构是否需要 JSON 模式?

    我问这个问题是因为我看到当前的 JSON 模式草案 http json schema org 建议采用以下方式拥有 JSON 架构 对于 JSON a abc b 123 草案中提出的模式是这样的 type object propertie
  • 使用 git filter-repo 将子目录拆分到其自己的存储库

    我正在关注这个 https docs github com en get started using git splitting a subfolder out into a new repository 我有一个名为my repo 其下面
  • 检查两个 php 页面之间的上次访问情况

    是否有某种 PHP 代码可以让我找出最后访问的两个页面中的哪一个 这就是我需要它的原因 我有 3 个页面 名为 user management php manage membership php and manage user php 有两
  • C# Windows 应用程序连接到系统的设备无法运行

    我看到以下异常来自 Windows 7 计算机上的 Windows 窗体应用程序 这才刚刚开始在这台机器上发生 它在其他机器上仍然可以正常工作 但在特定机器上却不行 例外 Exception Type System ApplicationE
  • 有延迟的 GAE 重定向

    是否可以在 GAE 中延迟重定向到另一个网址 我知道我可以使用 JavaScript 来实现此目的 但可能有一种方法可以在没有 JavaScript 的情况下进行延迟重定向吗 现在我用self redirect 来自GAE教程 谢谢 您可以
  • 我想在 PHP 中比较两个数组

    假设我有两个数组 如下所示 array1 array 1 3 5 array2 array x gt 1 y gt 2 z gt 5 如何以最有效和正确的方式检查两个数组是否完全相同 并且不关心数组的键名 array2 我想创建一个函数 如
  • GlobalSettings onStart 仅在第一次请求后触发

    当我启动播放服务器时 我只需要运行一些代码一次 使用 GlobalSettings OnStart 时 我注意到代码仅在向服务器发出第一个 http 请求后执行 知道如何在服务器启动后和发送任何请求之前运行我的代码吗 Thanks 这是应用
  • JS |如何以弧度为单位旋转?

    function lerp start end amt return 1 amt start amt end 这个 lerp 函数与坐标完美配合 我可以轻松地将 X 从 1 调整到 10 但当涉及轮换时就会出现问题 物体的旋转以弧度为单位
  • 如何在不加载关联实体的情况下获取关联实体的 id?

    考虑一个具有 单向 多对一关联的实体 EntityX type entity table x id id type integer generator strategy AUTO fields type type string manyTo
  • 避免嵌套 for 循环 python

    我有一个函数 它接受表达式并用我用作输入的值的所有排列替换变量 这是我已经测试过并且可以工作的代码 但是在查看了 SO 之后 人们说嵌套 for 循环是一个坏主意 但是我不确定如何提高效率 有人可以帮忙吗 谢谢 def replaceVar