从包含键的列表中为字典创建键

时间:2013-02-26 12:55:06

标签: python list dictionary python-2.7

我正在尝试构建一个矩阵,它在几个级别中包含多个值。 我正在尝试生成这样的字典:

{'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)

2 个答案:

答案 0 :(得分:1)

你应该使用

dict.setdefault()

请参阅docs

示例:

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

>> d["k"]
eggs

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

答案 1 :(得分:1)

我建议为collections.defaultdict使用嵌套chart_dict。它允许您提供工厂功能来设置新值,因此您请求的任何键始终有效。设置这样一个深层嵌套的结构有点棘手,但我认为以下内容将为您的四级结构做正确的事情(我假设您的<value>项也是字典,因为它似乎是你的当前代码预期):

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

有了这个,你应该能够做到以下几点,而不必担心以前引用字典中的任何键是否有任何键:

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

我建议你做一些像上面的变量解压缩一样的事情,尽管你应该使用比abc更好的名字。好的变量名称可以将难以理解的东西变成容易掌握的东西。