2013-02-26 53 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 
相关问题