如何在Python中构建Id-姓名-赛事-总积分的嵌套字典结构
问题:构建「ID->姓名->赛事->总积分」的结构化数据
现有一个存储ID与姓名映射的Python字典league_managers:
{1443956: 'Sean McBride', 1281609: 'Maghnus Og Dunne', 4841686: 'Pearse Bowes', 406739: 'Adam Mcconville', 196345: 'Niall McCurdy', 808057: 'John McDonald', 6365597: 'Tony Cassidy', 1322001: 'Tiarnan Mccaffrey', 350275: 'Eoghan McCurdy', 4820159: 'Ciaran McKeown', 7185401: 'Ryan Russell', 5203794: 'Michael Devenny', 3145058: 'Declan Lees'}
需要为每个ID调用API获取用户本赛季每轮赛事的积分,最终形成ID->姓名->赛事->总积分的结构化数据。现有部分代码如下:
api_url = ("https://fantasy.premierleague.com/api/leagues-classic/258305/standings") response = requests.get(api_url).json() league_managers = dict() manager_points = dict() for item in response['standings']['results']: managerId = item['entry'] managerName = item['player_name'] league_managers[managerId] = managerName for manager in league_managers: players_api_url = ("https://fantasy.premierleague.com/api/entry/"+ str(manager)+"/history/") playersResponse = requests.get(players_api_url).json() for gameweek in playersResponse['current']: event = gameweek['event'] total_points = gameweek['total_points']
请问如何修改代码实现需求?
解决方案
修改思路
- 调整
league_managers的结构:从原有的{ID: 姓名}改为嵌套字典{ID: {'name': 姓名, 'gameweeks': {赛事轮次: 总积分}}},直接承载所有结构化数据 - 修复循环嵌套问题:原代码中遍历赛事的循环不在经理循环内部,导致只会处理最后一个经理的数据,需要将其嵌套进经理遍历循环中
- 直接在经理的嵌套字典中存入每轮赛事的积分数据
完整修改后的代码
import requests api_url = "https://fantasy.premierleague.com/api/leagues-classic/258305/standings" response = requests.get(api_url).json() # 初始化结构化字典,每个ID对应包含姓名和赛事积分的嵌套结构 league_managers = {} for item in response['standings']['results']: manager_id = item['entry'] manager_name = item['player_name'] league_managers[manager_id] = { 'name': manager_name, 'gameweeks': {} } # 遍历每个经理,获取并存储每轮赛事积分 for manager_id, manager_data in league_managers.items(): players_api_url = f"https://fantasy.premierleague.com/api/entry/{manager_id}/history/" players_response = requests.get(players_api_url).json() # 遍历当前赛季所有轮次,将积分存入对应经理的gameweeks字典 for gameweek in players_response['current']: event_round = gameweek['event'] total_points = gameweek['total_points'] manager_data['gameweeks'][event_round] = total_points # 示例:验证结构化数据(打印第一个经理的信息) first_manager_id = next(iter(league_managers.keys())) print(f"经理ID: {first_manager_id}") print(f"姓名: {league_managers[first_manager_id]['name']}") print("每轮赛事积分:", league_managers[first_manager_id]['gameweeks'])
关键说明
- 使用
f-string拼接API URL,比字符串相加更简洁易读 - 每个经理的嵌套字典包含
name(姓名)和gameweeks(轮次-积分映射)两个键,完全符合需求的结构化逻辑 - 修复循环嵌套后,每个经理的赛事数据都会被独立获取并存储
- 末尾的示例代码可用于快速验证数据结构是否正确
内容的提问来源于stack exchange,提问作者Dev 101
相关产品推荐
相关产品推荐

