我遇到的问题是我的字典的关键值被覆盖而不是被添加。
my_list
是一个元组列表,其中每个元组由3个值组成:(string, string, int)
。
for i in range(0, len(my_list)):
dict = {my_list[i][1]: my_list[i][2]}
graph[my_list[i][0]] = dict
dict = {my_list[i][0]: my_list[i][2]}
graph[my_list[i][1]] = dict
print(graph)
如果my_list = [("A", "B", 1), ("A", "C", 3)]
,则此代码输出{B:{A:1},A:{C:3},C:{A:3}}
。但是,我希望它输出的是{B:{A:1},A:{B:1, C:3},C:{A:3}}
。
答案 0 :(得分:2)
您正在撰写graph[my_list[i][0]] = dict
,因此当然只需将dict
分配给my_list[i][0]
中的密钥graph
。
您要做的是使用dict
更新现有词典,如下所示:
graph[my_list[i][0]].update(dict)
但如果这是第一个怎么办?然后还没有更新的词典。
您可以使用setdefault
获取值(如果存在),或者设置默认值并获取默认值,然后您需要更新:
graph.setdefault(my_list[i][0], {}).update(dict)
或者你可以使用collections.defaultdict
,这实际上会自动将任何缺失的查询转换为setdefault
来电:
graph = defaultdict(dict)
# later, in your loop
graph[mylist[i][0]].update(dict)
顺便说一下,上面说明了为什么你不应该命名你的字典dict
。您需要能够访问实际的内置dict
类型才能将其提供给defaultdict
。如果您使用其他值隐藏了该名称,则会出现错误。所以将你的词典命名为dct
- 或者更好的是,实际上有意义的东西。
在Python中,应该有一种明显的方法来实现它。哪一个显而易见?嗯,这取决于您在此代码后使用graph
所做的事情。如果您希望每个失败的查找返回一个空字典,请使用defaultdict
;如果您希望每次失败的查询都引发KeyError
,请使用dict
setdefault
{。}}。