5

我想构建一个多级字典,例如:

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

我的问题是它是否存在我可以通过以下方式构建上述词典的功能:

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

4 回答 4

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'], {})
于 2013-02-18T10:39:42.740 回答
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': {}}}}

编辑:在我的解决方案中,最后一个参数{}将被复制到输出的每一片叶子中,作为对同一字典的引用。如果这是一个问题(用不可变对象替换它,例如浮点数、整数或字符串是另一回事),请使用copy.copy@matt 的想法。

于 2013-02-18T10:32:39.540 回答
2

使用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")
于 2013-02-18T10:32:59.880 回答
0

dict理解是一种很酷的方法,但前提是你的嵌套深度是固定的:

{x:{y:{z:{} for z in ['1', '2']} for y in 'AB'} for x in 'ab'}
于 2013-02-18T10:32:27.663 回答