[英]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.