1 回答

TA貢獻1719條經驗 獲得超6個贊
您希望每個事件的回合由列表表示。在您的嘗試中,這些行:
if ldata[1] or ldata[3]:
scheduled_json[ldata[0]]['round'+str(ldata[6])]['player1']=ldata[1]
scheduled_json[ldata[0]]['round'+str(ldata[6])]['player2']=ldata[3]
else:
scheduled_json[ldata[0]]['round'+str(ldata[6])]['team1']=ldata[7]
scheduled_json[ldata[0]]['round'+str(ldata[6])]['team2']=ldata[8]
... 將覆蓋嵌套在密鑰中的任何現有密鑰'round' + str(ldata[6])。
而不是這個:
scheduled_json[ldata[0]]['round'+str(ldata[6])]={}
使用list:
scheduled_json[ldata[0]]['round'+str(ldata[6])] = []
然后為每個事件的每一輪附加一個新dict的:list
if ldata[1] or ldata[3]:
d = {'player1': ldata[1], 'player2': ldata[2]}
else:
d = {'team1': ldata[7], 'team2': ldata[8]}
d['when_do_they_play'] = ldata[5]
scheduled_json[ldata[0]]['round'+str(ldata[6])].append(d)
從風格上講,您也可以對整體可讀性進行一些改進。例如,您的解決方案可以這樣重寫:
for ldata in scheduled_games:
event = ldata.event # the row proxy facilitates attribute access syntax
if event not in scheduled_json:
scheduled_json[event] = {}
round_key = f"round{ldata.round}" # have a look at f-string and str.format() for string concat
if round_key not in scheduled_json[event]:
print('init!')
scheduled_json[event][round_key] = []
if ldata.player1 or ldata.player2:
d = {'player1': ldata.player1, 'player2': ldata.player2}
else:
d = {'team1': ldata.team1, 'team2': ldata.team2}
d['when_do_they_play'] = ldata.when_do_they_play
scheduled_json[event][round_key].append(d)
您甚至可以更進一步并使用 acollections.defaultdict這樣您就不需要實例化空集合:
from collections import defaultdict
scheduled_json = defaultdict(lambda: defaultdict(list))
for ldata in scheduled_games:
if ldata.player1 or ldata.player2:
d = {'player1': ldata.player1, 'player2': ldata.player2}
else:
d = {'team1': ldata.team1, 'team2': ldata.team2}
d['when_do_they_play'] = ldata.when_do_they_play
scheduled_json[ldata.event][f"round{ldata.round}"].append(d)
添加回答
舉報