在Python中有优雅的方法构建多级字典吗?

5 投票
4 回答
5982 浏览
提问于 2025-04-17 16:14

我想创建一个多层级的字典,像这样:

A = { 
    'a': {
        'A': {
            '1': {}, 
            '2': {}, 
        },  
        'B': {
            '1': {}, 
            '2': {}, 
        },  
    },  
    'b': {
        'A': {
            '1': {}, 
            '2': {}, 
        },  
        'B': {
            '1': {}, 
            '2': {}, 
        },  
    },  
}

我的问题是,是否有一个函数可以帮助我构建上面的字典:

D = function(['a', 'b'], ['A', 'B'], ['1', '2'], {})

4 个回答

2

使用递归来编程很简单

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")
5
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': {}}}}

编辑: 在我的解决方案中,最后一个参数 {} 会被复制到输出的每个叶子节点,作为对同一个字典的引用。如果这会造成问题(用不可变对象,比如浮点数、整数或字符串来替换是另一回事),可以使用 @matt 提出的 copy.copy 的思路。

7

这段话的意思是,使用了一个叫做“复制”的功能,这样你就可以指定一个不同的叶子节点。否则,所有的叶子节点都会指向同一个字典。

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'], {})

撰写回答