Python:嵌套For循环,在循环列表时覆盖整个字典

Python:嵌套For循环,在循环列表时覆盖整个字典,python,dictionary,Python,Dictionary,目标: 我试图迭代嵌套字典的副本(基于简单的JSON模式),为代表团队及其成员的web服务器请求构建单独的JSON有效负载 每个有效负载都来自循环外部的字典,其中团队作为键,用户id作为值 问题: 我能够成功地复制源字典并创建团队字典,包括其第一个成员,但是在列表的第二次迭代中添加其他成员时,第一个成员被覆盖,而不是第二个成员被添加到字典负载中 这是我第一次使用嵌套字典,因此任何提示都将受到高度赞赏 # source dictionary teams_dict = {'Boston':['12

目标:

我试图迭代嵌套字典的副本(基于简单的JSON模式),为代表团队及其成员的web服务器请求构建单独的JSON有效负载

每个有效负载都来自循环外部的字典,其中团队作为键,用户id作为值

问题:

我能够成功地复制源字典并创建团队字典,包括其第一个成员,但是在列表的第二次迭代中添加其他成员时,第一个成员被覆盖,而不是第二个成员被添加到字典负载中

这是我第一次使用嵌套字典,因此任何提示都将受到高度赞赏

# source dictionary

teams_dict = {'Boston':['1234','5678'],
              'Atlanta':['9876','4321']}

# schema to be modified

payload_schema = {"data":
                  {"id":None,"type":"teams","attributes":
                   {"name":None},"relationships":
                   {"members":{"data":[{"id":None,"type":"users"}]}}}}

# loop

for team, members in teams_dict.items():
    team_load = deepcopy(payload_schema)
    team_load['data']['attributes']['name']=team
    #print(f"Now creating team {team}")
    for member in members:
        team_load['data']['relationships']['members']['data'][0]['id']=member
        team_load['data']['relationships']['members']['data'][0]['type']='users'
        print(team_load)
        #print(f"Added user id {member} to payload")
由于第一个成员被覆盖,因此我最终得到的有效负载仅包含第二个成员:

print(team_load)
{
'data':{'id':无,'type':'teams','attributes':{'name':'Atlanta'},'relationships':{'members':{'data':[{'id':'4321','type':'users'}}}

理想情况下,它将如下所示:

print(team_load)

{'data': {'id': None, 'type': 'teams', 'attributes': {'name':'Atlanta'}, 'relationships': {'members': {'data': [{'id': '9876','type': 'users'},{'id': '4321','type': 'users'}]}}}}

问题是,您总是使用以下内容写入索引0:

team_load['data']['relationships']['members']['data'][0]['id']=member
team_load['data']['relationships']['members']['data'][0]['type']='users'
以下是一份清单:

team_load['data']['relationships']['members']['data']
所以每次都需要附加到它

由于您处理的是嵌套对象,因此我将使成员信息成为另一个对象,并将其从有效负载模式中删除:

payload_schema = {"data":
              {"id":None,"type":"teams","attributes":
               {"name":None},"relationships":
               {"members":{"data":[]}}}}
member_schema = {"id":None,"type":"users"}
然后在内部循环中:

for member in members:
    member_load = deepcopy(member_schema)

    member_load['id']=member

    team_load['data']['relationships']['members']['data'].append(member_load)
    print(team_load)
您不需要将类型设置为“users”,因为它已在模式中设置,但如果您愿意,可以将其设置为其他值


希望这有帮助

反应很好。我会试一试,让你知道,但这是有意义的。如果成功了,请选择“正确”答案。谢谢将要做的是检查TMRW,看起来您总是覆盖到数据的索引0谢谢!这是有道理的。这和另一个回答一样有帮助。