想象一下嵌套的json结构如下:
node =
{
"0" : {
"param" : {
"filename" : "abc",
"delimiter" : "n"
},
"function" : "do something"
},
"1" : {
"param" : {
"filename" : "def",
"delimiter" : "n"
},
"function" : "do something"
},
"2" : {
"param" : {
"filename" : "ghi",
"delimiter" : "n"
},
"function" : "do something"
}
}
我希望将节点变量中的所有文件名替换为计算文件名。例如,我想将“0”,“1”和“2”中的所有文件名值替换为“example.pdf”。
Python中最优雅的方式或最短的方法是什么?
答案 0 :(得分:1)
正则表达式怎么样?
In [29]: import re
In [30]: json.loads(re.sub('(?<="filename": ")(.*?)(?=")', 'example.pdf', json.dumps(node)))
Out[30]:
{'0': {'function': 'do something',
'param': {'delimiter': 'n', 'filename': 'example.pdf'}},
'1': {'function': 'do something',
'param': {'delimiter': 'n', 'filename': 'example.pdf'}},
'2': {'function': 'do something',
'param': {'delimiter': 'n', 'filename': 'example.pdf'}}}
如果您不想替换每个实例,则无效。
答案 1 :(得分:0)
我不知道它是否优雅,但我会这样做:
for k,v in node.items():
v["param"]["filename"]="foo{}.pdf".format(k)
迭代字典键/值,&#34;导航&#34;到相关领域并进行更改(将其与要说明的关键值相关联)
(使用字典理解重建字典似乎有点过分了)
答案 2 :(得分:0)
万一你的密钥&#39; param&#39;并不总是相同,甚至不知道,你可以使用这个:
for k1, v1 in node.items():
for k2, v2 in v1.items():
if 'filename' in v2:
node[k1][k2]['filename'] = 'example.pdf'