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)
4

2 回答 2

1

你应该使用

dict.setdefault()

请参阅文档

例子:

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

>> d["k"]
eggs

d2 = {"k":1}
d2 = d2.setdefault("k","spam")
>> d2["k"]
1
于 2013-02-27T14:02:58.487 回答
1

我建议使用嵌套collections.defaultdict的 for 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)

我建议也做类似上面的变量解包的事情,尽管你可能应该使用比 , 和 . 更好ab名称c。好的变量名可以把难以理解的东西变成容易掌握的东西。

于 2013-02-27T15:48:46.313 回答