Python 字典在循环中未按预期更新

5

我正在尝试创建一个总结另一个字典的字典。我希望只有当关键字与details_dict中的“parent”值匹配时,才会更新summary_dict。然而,我的代码似乎没有按照我的预期访问summary_dict。打印语句显示它继续将内容添加到循环中的第一个可迭代对象中,而不是从summary_dict中获取正确的值。

detail_dict = {'a123': {"data": [1, 2, 3, 4], "parent": "a"},
               'a124': {"data": [1, 2, 3, 4, 5], "parent": "a"},
               'b123': {"data": [1, 2, 3], "parent": "b"},
               'b124': {"data": [1], "parent": "b"}}

summary_dict = dict.fromkeys(["a", "b"], {"data": [],
                                          "data_len": []})

for k, v in detail_dict.iteritems():
    summary_dict[v['parent']]["data"].append(v["data"])
    summary_dict[v['parent']]["data_len"].append(len(v["data"]))
    print "\nMy value is "
    print v
    print "\nMy summary dictionary now looks like:"
    print summary_dict[v['parent']]

我希望得到的字典如下所示:

结果字典应为:

{"a": {"data": [[1, 2, 3, 4], [1, 2, 3, 4, 5]],
       "data_len": [4, 5]},
 "b": {"data": [[1, 2, 3], [1]],
       "data_len": [3, 1]}}
2个回答

7

您正在向from_keys传递一个可变参数,因此引用在键之间被复制。

相反,请像这样创建您的字典,以便为每个键创建一个单独的引用:

summary_dict = {x : {"data": [],"data_len": []} for x in ["a","b"]}

请注意,由于字典的顺序不能保证,您可能会得到类似以下内容的结果:
{'a': {'data_len': [5, 4], 'data': [[1, 2, 3, 4, 5], [1, 2, 3, 4]]}, 'b': {'data_len': [3, 1], 'data': [[1, 2, 3], [1]]}}

您可以使用

for k, v in sorted(detail_dict.items()):

将项目排序,以使列表中的顺序是确定性的。


非常感谢!我自己永远不会发现那个陷阱。我以为在循环中调用它的方式肯定是正确的。 - LoveMeow

5
< p > dict.fromkeys 方法为每个值使用相同的实例

summary_dict = dict.fromkeys(["a", "b"], {"data": [], "data_len": []})

修改一个键的字典将影响所有键。最好只使用不可变对象作为默认值来使用dict.fromkeys,以避免这个陷阱。

尝试使用字典推导式代替:

summary_dict = {k: {"data": [], "data_len": []} for k in 'ab'}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接