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

Lov*_*eow 3 python dictionary loops iteritems

我正在尝试创建一个总结另一个的字典.我希望仅当密钥与details_dict中的"parent"值匹配时才会更新summary_dict.我所写的内容似乎并没有像我期望的那样访问summary_dict.print语句显示它继续追加循环中的第一个iterable,而不是从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']]
Run Code Online (Sandbox Code Playgroud)

我想要的结果字典是:

{"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]}}
Run Code Online (Sandbox Code Playgroud)

Jea*_*bre 5

你传递一个可变参数,from_keys所以在键之间复制引用.

像这样创建你的dict而不是为每个键创建一个单独的ref:

summary_dict = {x : {"data": [],"data_len": []} for x in ["a","b"]}
Run Code Online (Sandbox Code Playgroud)

请注意,由于dict的顺序无法保证,您可以获得如下内容:

{'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]]}}
Run Code Online (Sandbox Code Playgroud)

你可以用

for k, v in sorted(detail_dict.items()):
Run Code Online (Sandbox Code Playgroud)

对项目进行排序,使列表中的顺序具有确定性.


wim*_*wim 5

dict.fromkeysmethod 为每个值使用相同的实例.

summary_dict = dict.fromkeys(["a", "b"], {"data": [], "data_len": []})
Run Code Online (Sandbox Code Playgroud)

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

试试这个词典理解:

summary_dict = {k: {"data": [], "data_len": []} for k in 'ab')
Run Code Online (Sandbox Code Playgroud)