簡體   English   中英

Python:遍歷列表時嵌套循環覆蓋整個字典

[英]Python: Nested For Loop Overwriting Entire Dictionary When Looping Through List

目標:

我正在嘗試對嵌套字典的副本(基於簡單的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:

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)

您無需將類型設置為“用戶”,因為已經在模式中進行了設置,但是您可以根據需要將其設置為其他值。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM