我知道这可能是一个非常幼稚的错误,但是这已经让我有些不安了。

我有像这样的嵌套字典列表

grs = [{
    'CS9': {
        'Monday': [{
                1: {
                    'subject': 'ESD',
                    'teacherName': 'Goku',
                    'venue': 'RN 141'
                }
            }, {
                3: {
                    'subject': 'CN',
                    'teacherName': 'vegita',
                    'venue': 'RN 102'
                }
            }, {
                5: {
                    'subject': 'ADA',
                    'teacherName': 'roshi',
                    'venue': 'RN 112'
                }
            }
        ]

    }
}, {
    'CS10': {
        'Monday': [{
                1: {
                    'subject': 'ESD',
                    'teacherName': 'Gohan ',
                    'venue': 'RN 141'
                }
            }, {
                3: {
                    'subject': 'CN',
                    'teacherName': 'Saitama',
                    'venue': 'RN 102'
                }
            }, {
                5: {
                    'subject': 'ADA',
                    'teacherName': 'Mob',
                    'venue': 'RN 112'
                }
            }
        ]
    }
}
]


简而言之,两个组以Monday为节点,而不同的events在不同的slots

所以,我要做的是更新MondayCS10节点
与数据=>

tempStuff = [{'subject': 'ESD', 'teacherName': 'Aizen', 'venue': 'RN141'}, 'CS10', 2, 'Monday']


所以我要做的是:

for i in grs:
    if tempStuff[1] in i.keys():
        i[tempStuff[1]][tempStuff[3]].append({tempStuff[2]: tempStuff[0]})


我期望添加此代码以添加另一个字典wiz

            {
                2: {
                    'subject': 'ESD',
                    'teacherName': 'Aizen',
                    'venue': 'RN141'
                }
            }


这样做,但是它也将此节点添加到CS9。我尝试了不同的方法来制作数据,并以不同的方式进行插入,但是更改发生在两个节点上。

为什么?
有什么帮助吗?

编辑1

裁剪的json中没有问题,即我已将两个节点中的数据从Tuesday删除到Friday,以确保问题中json的可读性,因为其他节点在插入。所以我只提到了Monday

编辑2

似乎在运行时创建grs时出现了问题,我们在这里所做的是我们自己声明了grs,而在我的代码中grs被“填充”或其他循环发生了数据插入条件。但是,一切完成后,grs与我们在此处声明的不变相同。即,插入后得到的grs与我们在此处声明的grs完全相同。

编辑3

因此,这是将代码从另一个嵌套的dict /列表(FinalDict)插入我们神秘的“ grs”中的代码。

      dataArrange = {}

      for g in groups:  # groups is just a list of groups eg CS10, CS9
            for i in FinalDict: # the data from which i'm putting the stuff to grs
                weekdet = []
                for b in FinalDict[i]['lectures']:
                    lectdetails = []
                    if b[0] == 'Remedial Class':
                        slot = b[1]['slot']
                    else:
                        slot = b[3]['slot']
                        subject = b[0]
                        teacherName = b[1]
                        venue = b[2]
                        lectdetails = {'subject': subject, 'teacherName': teacherName, 'venue': venue}

                    try:

                        if ShortCode[lectdetails['subject']] in ElectiveStuff:
                            continue

                    except IndexError:
                        continue

                    if not lectdetails:
                        weekdet.append({slot: "Remedial Class"})
                    else:
                        weekdet.append({slot: lectdetails})

                dataArrange.update({i: weekdet})
            grs.append({g: dataArrange})

        with open('stuff.txt', 'w') as g:  # here we wrote grs in a file which makes me sad though it solves the problem
            g.write(json.dumps(grs))

最佳答案

我怀疑这是一个共享的参考问题。这里:

dataArrange = {}

for g in groups:
    # code here
    dataArrange.update({i: weekdet})
    grs.append({g: dataArrange})


您一遍又一遍地重复使用dataArrange,因此最后grs[x]{g}都引用了相同的唯一字典。您必须了解Python绝不会隐式复制任何内容。

解决方案非常简单:不要一次又一次地重复使用相同的dataArrange字典,而是每次创建一个新字典。

07-24 15:41