Python字典在循环中没有像预期的那样更新

问题描述:

我想创建一个总结另一个字典的字典。我希望summary_dict仅在关键字与details_dict中的“父”值相匹配时更新。我写的东西似乎没有像我期望的那样访问summary_dict。打印语句显示它继续附加到循环中的第一个迭代,而不是从summary_dict中获取正确的值。Python字典在循环中没有像预期的那样更新

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]}} 

你传递一个可变参数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()): 

对项目进行排序,因此列表中的顺序是确定性的。

+0

非常感谢!我从来没有想过自己制定出这个陷阱。我认为这是他们肯定的方式,我正在循环中调用它 – LoveMeow

dict.fromkeys方法对每个值使用相同实例

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

修改字典中的一个键会影响所有键。最好仅将dict.fromkeys与默认值的不可变对象一起使用,以避免此陷阱。

试试这个字典包容来代替:

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