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()):
对项目进行排序,因此列表中的顺序是确定性的。
答
dict.fromkeys
方法对每个值使用相同实例。
summary_dict = dict.fromkeys(["a", "b"], {"data": [], "data_len": []})
修改字典中的一个键会影响所有键。最好仅将dict.fromkeys
与默认值的不可变对象一起使用,以避免此陷阱。
试试这个字典包容来代替:
summary_dict = {k: {"data": [], "data_len": []} for k in 'ab')
非常感谢!我从来没有想过自己制定出这个陷阱。我认为这是他们肯定的方式,我正在循环中调用它 – LoveMeow