如何在字典上动态迭代



如何使用动态查询遍历字典/JSON。

例如考虑下面的字典

dict = {'Adam': {
'English': {
'Score': 99,
'Time': 3400,
'Classes': 4},
'Math': {
'Score': 45,
'Time': 779,
'Classes': 5}},
'Tim': {
'English': {
'Score': 74,
'Time': 12,
'Classes': 99},
'Math': {
'Score': 12,
'Time': 333,
'Classes': 1}}
}

我想设置给定路径的值,例如

path = '/Adam/English/Score'
new_value = 87

注意,赋值也可以是另一个字典,例如

path = '/Adam/English'
new_value = {'Score': 11,
'Time': 2,
'Classes': 9}

任何帮助都是有用的。

编辑:下面是我的尝试
keys = path.split('/')[1:]
new_data = None
for key in keys:
if new_data is None:
new_data = dict[key]
else:
new_data = new_data[key]
new_data = new_value
print(dict)

但是这里的dict仍然是原来的值

我做了一些假设,例如,'/'不是任何字典键的一部分,并且路径必须是有效的。根据需要调整功能

def deep_set(d, path, value):
sep = '/'
*trail, last = path.strip(sep).split(sep)

for part in trail:
d = d[part]

d[last] = value

演示:

>>> d = {'a': 1}
>>> deep_set(d, 'a', 2)
>>> d
{'a': 2}
>>> d = {'a': {'b': 1}}
>>> deep_set(d, 'a/b', 2)
>>> d
{'a': {'b': 2}}

编辑:

注意,如果有连续的'/'字符,那么空字符串将被查找为字典键。例如

'a/b//c'.split('/') -> ['a', 'b', '', 'c']

目前还不清楚你是否想把'/'字符作为路径的一部分(在我的函数中,它们被str.strip删除)。同样,根据需要进行调整。

最新更新