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

我正在尝试构建一个矩阵,该矩阵在多个级别中保存多个值。 我试图生成字典建立这样的:从包含键的列表创建字典的键

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

回答:

我建议使用嵌套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。好的变量名称可能会让某些难以理解的东西变成易于理解的东西。

回答:

你应该用一个简单的方法

dict.setdefault() 

见docs。

实施例:

d = {} 

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

>> d["k"]

eggs

d2 = {"k":1}

d2 = d2.setdefault("k","spam")

>> d2["k"]

1

以上是 从包含键的列表创建字典的键 的全部内容, 来源链接: utcz.com/qa/262038.html

回到顶部