在深度嵌套的字典中添加所有值
Prepend all values in deeply nested dictionary
我有一个深度嵌套的字典(任意键和值),如:
data = {
'a': {
'path': '/a/a.txt'
},
'b': {
'b1': {
'path': '/b/b1/b1.txt'
},
'b2': {
'path': '/b/b2/b2.txt'
}
}
'c': {
'c1': {
'c12': {
'path': '/c/c1/c12/c12.txt'
}
},
'c2': {
'c22': {
'path': '/c/c1/c22/c22.txt'
}
},
'c3': {
'c32': {
'path': '/c/c1/c32/c32.txt'
}
}
}
.
.
.
}
我的目标是为字典中的每个值添加特定路径。所以基本上把上面的数据拿进去,对其进行操作:
def prepend(value, data):
return magic
data = prepend('predir/z', data)
并使生成的字典看起来像:
data = {
'a': {
'path': 'predir/z/a/a.txt'
},
'b': {
'b1': {
'path': 'predir/z/b/b1/b1.txt'
},
'b2': {
'path': 'predir/z/b/b2/b2.txt'
}
}
'c': {
'c1': {
'c12': {
'path': 'predir/z/c/c1/c12/c12.txt'
}
},
'c2': {
'c22': {
'path': 'predir/z/c/c1/c22/c22.txt'
}
},
'c3': {
'c32': {
'path': 'predir/z/c/c1/c32/c32.txt'
}
}
}
.
.
.
}
我知道我可以像这样使用递归循环遍历字典:
def prepend(directory, config):
for k, v in config.items():
if isinstance(v, dict):
prepend(directory, v)
else:
# do something
但是,我无法在迭代期间更改这些值。非常感谢任何帮助!谢谢!
在else
分支中,只需将前缀添加到现有值中,并将其存储在键中:
def prepend(directory, config):
for k, v in config.items():
if isinstance(v, dict):
prepend(directory, v)
else:
config[k] = directory + v
return config
你必须使用
else:
config[k] = directory + config[k]
或
else:
config[k] = directory + v
它会直接改变原来的值 data
所以你不需要 return config
。
顺便说一句:如果你想保留原始数据,那么你必须在函数中创建new_config
。
def prepend(directory, config):
new_config = {}
for k, v in config.items():
if isinstance(v, dict):
new_config[k] = prepend(directory, v)
else:
new_config[k] = directory + v
return new_config
new_data = prepend('predir/z', data)
print(data)
print(new_data)
我有一个深度嵌套的字典(任意键和值),如:
data = {
'a': {
'path': '/a/a.txt'
},
'b': {
'b1': {
'path': '/b/b1/b1.txt'
},
'b2': {
'path': '/b/b2/b2.txt'
}
}
'c': {
'c1': {
'c12': {
'path': '/c/c1/c12/c12.txt'
}
},
'c2': {
'c22': {
'path': '/c/c1/c22/c22.txt'
}
},
'c3': {
'c32': {
'path': '/c/c1/c32/c32.txt'
}
}
}
.
.
.
}
我的目标是为字典中的每个值添加特定路径。所以基本上把上面的数据拿进去,对其进行操作:
def prepend(value, data):
return magic
data = prepend('predir/z', data)
并使生成的字典看起来像:
data = {
'a': {
'path': 'predir/z/a/a.txt'
},
'b': {
'b1': {
'path': 'predir/z/b/b1/b1.txt'
},
'b2': {
'path': 'predir/z/b/b2/b2.txt'
}
}
'c': {
'c1': {
'c12': {
'path': 'predir/z/c/c1/c12/c12.txt'
}
},
'c2': {
'c22': {
'path': 'predir/z/c/c1/c22/c22.txt'
}
},
'c3': {
'c32': {
'path': 'predir/z/c/c1/c32/c32.txt'
}
}
}
.
.
.
}
我知道我可以像这样使用递归循环遍历字典:
def prepend(directory, config):
for k, v in config.items():
if isinstance(v, dict):
prepend(directory, v)
else:
# do something
但是,我无法在迭代期间更改这些值。非常感谢任何帮助!谢谢!
在else
分支中,只需将前缀添加到现有值中,并将其存储在键中:
def prepend(directory, config):
for k, v in config.items():
if isinstance(v, dict):
prepend(directory, v)
else:
config[k] = directory + v
return config
你必须使用
else:
config[k] = directory + config[k]
或
else:
config[k] = directory + v
它会直接改变原来的值 data
所以你不需要 return config
。
顺便说一句:如果你想保留原始数据,那么你必须在函数中创建new_config
。
def prepend(directory, config):
new_config = {}
for k, v in config.items():
if isinstance(v, dict):
new_config[k] = prepend(directory, v)
else:
new_config[k] = directory + v
return new_config
new_data = prepend('predir/z', data)
print(data)
print(new_data)