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

編集:私のソリューションでは、最後の引数{}は、同じ辞書への参照として出力のすべてのリーフにコピーされます。これが問題である場合(float、integer、stringなどの不変オブジェクトに置き換えるのは別のことです)、copy.copy@mattのアイデアを使用してください。

于 2013-02-18T10:32:39.540 に答える
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")
于 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 に答える