[英]Is there any elegant way to build a multi-level dictionary in python?
我想构建一个多级字典,如:
A = {
'a': {
'A': {
'1': {},
'2': {},
},
'B': {
'1': {},
'2': {},
},
},
'b': {
'A': {
'1': {},
'2': {},
},
'B': {
'1': {},
'2': {},
},
},
}
我的问题是它是否存在一个函数,我可以通过以下方式构建上述用语:
D = function(['a', 'b'], ['A', 'B'], ['1', '2'], {})
这使用复制功能允许您指定不同的叶节点。 否则所有叶子将指向同一个字典。
from copy import copy
def multidict(*args):
if len(args) == 1:
return copy(args[0])
out = {}
for x in args[0]:
out[x] = multidict(*args[1:])
return out
print multidict(['a', 'b'], ['A', 'B'], ['1', '2'], {})
def multi(*args):
if len(args) > 1:
return {arg:multi(*args[1:]) for arg in args[0]}
else:
return args[0]
multi(['a', 'b'], ['A', 'B'], ['1', '2'], {})
回报
{'a': {'A': {'1': {}, '2': {}}, 'B': {'1': {}, '2': {}}},
'b': {'A': {'1': {}, '2': {}}, 'B': {'1': {}, '2': {}}}}
编辑 :在我的解决方案中,最后一个参数{}
将被复制到输出的每个叶子中作为对同一个字典的引用。 如果这是一个问题(将其替换为不可变对象,例如float,integer或string则是另一回事),请使用copy.copy
构思。
使用recusion很容易写
def multi_level_dict(*args):
x = dict()
if args:
for k in args[0]:
x[k] = multi_level_dict(*args[1:])
return x
你的情况会是
multi_level_dict(["a", "b"], ["A", "B"], ["1", "2"])
甚至
multi_level_dict("ab", "AB", "12")
dict理解是一种很酷的方法,但只有嵌套深度是固定的:
{x:{y:{z:{} for z in ['1', '2']} for y in 'AB'} for x in 'ab'}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.