【发布时间】: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() 结果。它没有抛出错误..只是没有附加到元素。
关于处理此问题的最佳方法的任何想法?
【问题讨论】: