【问题标题】:Python: Nested For Loop Overwriting Entire Dictionary When Looping Through ListPython:循环遍历列表时嵌套的For循环覆盖整个字典
【发布时间】:2019-07-28 01:29:53
【问题描述】:

目标:

我正在尝试迭代嵌套字典的副本(基于简单的 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': None, '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
  • 谢谢!那讲得通。这和其他回复一样有用。

标签: python dictionary


【解决方案1】:

问题是你总是用这个写到索引 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)

您无需将类型设置为“用户”,因为它已在架构中设置,但您可以根据需要将其设置为不同的值。

希望这会有所帮助!

【讨论】:

  • 漂亮的回应。我会试一试,让你知道,但这是有道理的。
  • 如果成功,请选择“正确”答案。谢谢!
  • 会去检查 tmrw
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 2015-10-30
  • 2021-11-20
相关资源
最近更新 更多