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)
添加回答
举报