簡體   English   中英

有沒有優雅的方法在python中構建一個多級字典?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM