1 回答

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個(gè)贊
您希望每個(gè)事件的回合由列表表示。在您的嘗試中,這些行:
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]
... 將覆蓋嵌套在密鑰中的任何現(xiàn)有密鑰'round' + str(ldata[6])。
而不是這個(gè):
scheduled_json[ldata[0]]['round'+str(ldata[6])]={}
使用list:
scheduled_json[ldata[0]]['round'+str(ldata[6])] = []
然后為每個(gè)事件的每一輪附加一個(gè)新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)
從風(fēng)格上講,您也可以對(duì)整體可讀性進(jìn)行一些改進(jìn)。例如,您的解決方案可以這樣重寫:
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)
您甚至可以更進(jìn)一步并使用 acollections.defaultdict這樣您就不需要實(shí)例化空集合:
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)
添加回答
舉報(bào)