嵌套 insertion/creation 个字典
Nested insertion/creation of dictionary
假设你有一个空字典
data = {}
我有一个路径和一个值
path = "root.sub.item"
value = 12
如何递归添加不存在的对象?
def add_value(path, value):
for part in path.split('.'):
if not part in data:
data[part] = {}
此操作的预期输出为:
data = {
'root':{
'sub':{
'item': 12
}
}
}
有人可以帮忙解决这个问题或为我指明正确的方向吗?
我正在使用 Python 3.6.
你快到了,你只需要跟踪你进入树结构的程度,以及知道你何时到达路径最后一个元素的方法:
def add_value(path, value):
tmp = data
parts = list(path.split('.'))
for i in range(len(parts) - 1):
part = parts[i]
if not part in tmp:
tmp[part] = {}
tmp = tmp[part]
tmp[parts[-1]] = value
您可以使用另一种解决方案,例如 this answer 中的递归 defaultdict。
关于如何使用它的快速而愚蠢的示例:
from collections import defaultdict
def func(rdict, path, value):
items = path.split('.')
d = rdict[items[0]]
for item in items[1:-1]:
d = d[item]
d[items[-1]] = value
nested_dict = lambda: defaultdict(nested_dict)
result = nested_dict()
func(result, 'root.sub.item', 12)
func(result, 'root.moon.value', 1)
assert result['root']['sub']['item'] == 12
assert result['root']['moon']['value'] == 1
assert result['root']['moon']['noop'] != 0
你可以试试 Raymond Hettinger 的食谱:
来源:https://twitter.com/raymondh/status/343823801278140417
from collections import defaultdict
infinity_dict=lambda:defaultdict(infinity_dict)
d=infinity_dict()
d['root']['sub']['item'] = 12
假设你有一个空字典
data = {}
我有一个路径和一个值
path = "root.sub.item"
value = 12
如何递归添加不存在的对象?
def add_value(path, value):
for part in path.split('.'):
if not part in data:
data[part] = {}
此操作的预期输出为:
data = {
'root':{
'sub':{
'item': 12
}
}
}
有人可以帮忙解决这个问题或为我指明正确的方向吗?
我正在使用 Python 3.6.
你快到了,你只需要跟踪你进入树结构的程度,以及知道你何时到达路径最后一个元素的方法:
def add_value(path, value):
tmp = data
parts = list(path.split('.'))
for i in range(len(parts) - 1):
part = parts[i]
if not part in tmp:
tmp[part] = {}
tmp = tmp[part]
tmp[parts[-1]] = value
您可以使用另一种解决方案,例如 this answer 中的递归 defaultdict。
关于如何使用它的快速而愚蠢的示例:
from collections import defaultdict
def func(rdict, path, value):
items = path.split('.')
d = rdict[items[0]]
for item in items[1:-1]:
d = d[item]
d[items[-1]] = value
nested_dict = lambda: defaultdict(nested_dict)
result = nested_dict()
func(result, 'root.sub.item', 12)
func(result, 'root.moon.value', 1)
assert result['root']['sub']['item'] == 12
assert result['root']['moon']['value'] == 1
assert result['root']['moon']['noop'] != 0
你可以试试 Raymond Hettinger 的食谱:
来源:https://twitter.com/raymondh/status/343823801278140417
from collections import defaultdict
infinity_dict=lambda:defaultdict(infinity_dict)
d=infinity_dict()
d['root']['sub']['item'] = 12