从包含键的列表创建字典的键
我正在尝试构建一个矩阵,该矩阵在多个级别中保存多个值。 我试图生成字典建立这样的:从包含键的列表创建字典的键
{'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.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
。好的变量名称可能会让某些难以理解的东西变成易于理解的东西。
回答:
你应该用一个简单的方法
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