2013-02-18 39 views
4

我想建立一個多層次的字典等類是否有任何優雅的方式來在python中構建多級字典?

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

我的問題是,它是否存在,我可以通過建立上述文辭功能:

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

回答

5

這將使用複製功能,允許你指定一個不同的葉節點來寫。否則,所有的葉子將指向相同的字典。

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

+1副本。 – eumiro 2013-02-18 10:44:44

0

字典理解是對於一個很酷的方法,但是隻有當你嵌套深度是固定的:

{x:{y:{z:{} for z in ['1', '2']} for y in 'AB'} for x in 'ab'} 
+0

假設固定深度使其比其他答案沒有用處。 – Junuxx 2013-02-18 10:35:41

+0

這不會使答案不好,因爲我明確說明它何時可以使用。 – dmg 2013-02-18 10:37:57

+0

這在技術上不是錯誤的,你提到這個假設很好,但恕我直言,這仍然是僵化和難以維持。這個問題中的字典也可能只是一個簡單的例子。如果深度固定在12個水平,你還會這樣做嗎?正如問題標題所要求的那樣,我認爲它不是「優雅」的。 – Junuxx 2013-02-18 10:49:20

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

EDIT:在我的解決方案中,最後一個參數{}將被複制到輸出,以相同的參考字典的每一片葉子。如果這是一個問題(用一個不可變的對象替換它,例如float,integer或string是另一回事),請使用@matt的copy.copy想法。

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") 
相關問題