我正在尝试构建一个矩阵,它在几个级别中包含多个值。 我正在尝试生成这样的字典:
{'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 :(得分: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)
我建议你做一些像上面的变量解压缩一样的事情,尽管你应该使用比a
,b
和c
更好的名字。好的变量名称可以将难以理解的东西变成容易掌握的东西。