【问题标题】:Python: Easy way to loop through dictionary parameters from a list of evaluated strings?Python:从评估字符串列表中循环遍历字典参数的简单方法?
【发布时间】:2019-12-20 10:57:48
【问题描述】:

我有一个从 json 文件创建的字典。这个字典有一个嵌套结构,每隔几周就会添加额外的参数。

当我想要添加多个“腿”时,我使用脚本来生成现有参数的额外副本。所以我首先添加额外的腿。假设我从 1 条腿作为模板开始,我想要 10 条腿,我将再克隆该腿 9 次并将其添加到列表中。

然后我遍历每个参数(称为属性),并且必须为添加的每条腿克隆某些元素,以便它具有 1:1 匹配。我不关心内容,所以克隆第一条腿值就可以了。

所以我做了以下事情:

    while len(data['attributes']['groupA']['params']['weights']) < legCount:
        data['attributes']['groupA']['params']['weights'].append(data['attributes']['groupA']['params']['weights'][0])

    while len(data['attributes']['groupB']['paramsGroup']['factors']) < legCount:
        data['attributes']['groupB']['paramsGroup']['factors'].append(data['attributes']['groupB']['paramsGroup']['factors'][0])

    while len(data['attributes']['groupC']['items']['delta']) < legCount:
        data['attributes']['groupC']['items']['delta'].append(data['attributes']['groupC']['items']['delta'][0])

我想做的是将这些属性全部设为字符串,然后动态循环它们,这样当我需要添加其他属性时,我只需将一个字符串粘贴到我的列表中,它就可以在没有另一个 while 循环的情况下工作。

所以我把它转换成这个:

    attribs = [
        "data['attributes']['groupA']['params']['weights']",
        "data['attributes']['groupB']['paramsGroup']['factors']",
        "data['attributes']['groupC']['items']['delta']",
        "data['attributes']['groupD']['xxxx']['yyyy']"
    ]

    for attrib in attribs:
        while len(eval(attrib)) < legCount:
            eval(attrib).append(eval(attrib)[0])

在这种情况下 eval 是安全的,因为没有用户输入,只有定义的条目列表。我也不介意找到 eval 的替代方案。

它一直工作到最后一行。我不认为 .append 正在处理 eval() 结果。它没有抛出错误..只是没有附加到元素。

关于处理此问题的最佳方法的任何想法?

【问题讨论】:

    标签: python loops dynamic


    【解决方案1】:

    不是 100% 确定这会解决问题,但我确实注意到一件事。

    在您正在访问的 while 条件下的上述代码中:

    data['attributes']['groupA']['params']['weights']

    那么你正在追加到

    data['attributes']['groupA']['params']['legs']

    在您的以下代码中,您似乎在第一次迭代时附加到'weights'。但是,这并不能解释您正在评估的其他属性……我注意到的只是一个危险信号。

    【讨论】:

    • 不,我只是编辑实际值,例如清酒。只是一个复制/粘贴错字。我已经在上面更正了
    【解决方案2】:

    实际上我的代码正在运行。我只是在检查错误的变量。谢谢我! :)

    【讨论】:

      猜你喜欢
      • 2014-09-19
      • 2019-03-22
      • 2021-06-11
      • 2014-06-27
      • 2015-10-30
      • 2023-01-24
      • 2019-07-10
      • 1970-01-01
      相关资源
      最近更新 更多