如何遍历python字典,将字典的键设置为另一个字典的值

时间:2020-09-15 04:15:01

标签: python list dictionary immutability

我来自C ++背景,我是Python的新手,我怀疑这个问题与[im]可变性有关。

我正在用Python构建JSON表示形式,该表示形式在一个“对象”中涉及多层嵌套列表和字典。我的目标是在最终结果上调用jsonify,使其看起来像结构良好的数据。

在构建对象时遇到问题:

approval_groups_list = list()
approval_group_dict = dict()

for groupMemKey, groupvals in groupsAndMembersDict.items():
    approval_group_dict["group_name"] = groupMemKey  
    approval_group_dict["name_dot_numbers"] = groupvals # groupvals is a list of strings
    approval_groups_list.append(approval_group_dict)

entity_approval_unit["approval_groups"] = approval_groups_list

第一次运行的结果与预期的一样,但是在最后一次触摸groupMemkey时,这就是所有其他对象的镜像。

groupsAndMembersDict= {
 'Art': ['string.1', 'string.2', 'string.3'],
 'Math': ['string.10', 'string.20', 'string.30']
}

预期结果:

批准组:

[
 {
  "group_name": "Art",
  "name_dot_numbers": ['string.1', 'string.2', 'string.3']
 },
 {
  "group_name": "Math",
  "name_dot_numbers": ['string.10', 'string.20', 'string.30']
 }
]

实际结果

批准组:

[
 {
  "group_name": "Math",
  "name_dot_numbers": ['string.10', 'string.20', 'string.30']
 },
 {
  "group_name": "Math",
  "name_dot_numbers": ['string.10', 'string.20', 'string.30']
 }
]

发生了什么,如何解决?

2 个答案:

答案 0 :(得分:0)

通过写这个问题,我想到了一些可以解决此问题的方法,但是解决了我的问题-但是,我仍然不知道为什么会这样。也许更像是指针/引用问题?

approval_groups_list = list()
approval_group_dict = dict()

for groupMemKey, groupvals in groupsAndMembersDict.items():
    approval_group_dict["group_name"] = groupMemKey  
    approval_group_dict["name_dot_numbers"] = groupvals 
    approval_groups_list.append(approval_group_dict.copy())  # <== note, here is the difference ".copy()"

entity_approval_unit["approval_groups"] = approval_groups_list

编辑:问题原来是Python一直都是[object]参考引用 。如果像我这样的Python新手,这意味着:“按引用传递,除非传递的东西是不可变的,否则按值传递”。因此,它在某种程度上没有与[im]可变性有关。主要是因为我缺乏对Python如何传递引用的理解。

答案 1 :(得分:0)

您的问题不是不变性,而是对象的可变性。我敢肯定,如果使用等效的C ++代码,您最终将获得相同的结果。

您在approval_group_dict循环之前构造for,并继续重复使用它。您所要做的就是在for内移动构造,以便为每个循环创建一个新对象:

approval_groups_list = list()

for groupMemKey, groupvals in groupsAndMembersDict.items():
    approval_group_dict = dict()
    ...