2013-02-26 80 views
1

我正在嘗試構建一個矩陣,該矩陣在多個級別中保存多個值。 我試圖生成字典建立這樣的:從包含鍵的列表創建字典的鍵

{'routername':{'channel':{'01':<value>,'02':<value>}}} 

鍵上最高水平的數量可能會有所不同。

該腳本正在生成可用路由器列表和另一個可用通道列表。 我寫了一個相當麻煩的函數來測試一個關鍵字,如果它不在那裏,它會將關鍵字添加到字典中。

所以,我在想,如果沒有建立在與鍵空值的字典列表「路由器」

def AddToChart(passed_seq): 
    try: 
     if str(passed_seq[0]) in chart_dict: 
      if str(passed_seq[1]) in chart_dict[passed_seq[0]]: 
       if str(passed_seq[2]) in chart_dict[passed_seq[0]][passed_seq[1]]: 
        if str(passed_seq[3]) in chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]]: 
         chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict) 

        else:  
         chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]].update({passed_seq[3]:{}}) 
         chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict) 
       else: 
        chart_dict[passed_seq[0]][passed_seq[1]].update({passed_seq[2]:{passed_seq[3]:{}}}) 
        chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict) 
      else: 
       chart_dict[passed_seq[0]].update({passed_seq[1]:{passed_seq[2]:{passed_seq[3]:{}}}}) 
       chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict) 
     else:  
      chart_dict.update({passed_seq[0]:{passed_seq[1]:{passed_seq[2]:{passed_seq[3]:{}}}}}) 
      chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict) 
    except ValueError: 
     print "AddToChart: ",err_sub_dict,sys.exc_info()[1][0] 
    except: 
     print sys.exc_info() 
     print "AddToChart: variable not defined: " + str(passed_seq) 
+0

這是什麼語言?請標記語言! – 2013-02-26 12:56:43

回答

1

我建議使用嵌套collections.defaultdictchart_dict。它允許您提供工廠功能來設置新值,因此您請求的任何密鑰都將始終有效。設置這樣一個深度嵌套的結構有點棘手,但我認爲以下內容會爲您的四級結構做正確的事情(我假設您的<value>項目也是字典,因爲它似乎是您當前的代碼所期望的) :

chart_dict = defaultdict(lambda:defaultdict(lambda:defaultdict(dict))) 

有了到位,則應能做到以下幾點,而不用擔心是否有任何引用以前在字典中的任何按鍵:

a, b, c = passed_seq 
chart_dict[a][b][c].update(err_sub_dict) 

我建議做某事就像上面的變量解包一樣,儘管你應該使用比a更好的名字, bc。好的變量名稱可能會讓某些難以理解的東西變成易於理解的東西。

1

你應該用一個簡單的方法

dict.setdefault() 

docs

實施例:

d = {} 
d = d.setdefault("k","eggs") 

>> d["k"] 
eggs 

d2 = {"k":1} 
d2 = d2.setdefault("k","spam") 
>> d2["k"] 
1 
相關問題