字典覆盖

时间:2018-03-14 05:23:15

标签: python dictionary

我遇到的问题是我的字典的关键值被覆盖而不是被添加。 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}}

1 个答案:

答案 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 {。}}。