Python代码遇IndexError: list index out of range问题求助
问题描述
运行以下Python代码时遇到IndexError: list index out of range错误,目标是仅收集当前NFL赛事信息,已尝试通过JSON中的字段识别赛事,但运行出错。本人是Python新手,若表述浅显请见谅。
代码片段
# US FOOTBALL EVENT INFO API LINK link = 'http://xxxxxx.net/v1/feeds/sportsbookv2/event/group/1000093199.json?app_id=21e03bb8&app_key' \ '=c0191eaf354cc07bc3769817b8c1acd0&local=en_AU&includeparticipants=false&site=www.xxxx.com.au ' # Request data from link as 'str' data = requests.get(link).text # convert 'str' to Json data = json.loads(data) # JSON PARSE for event_data in data['events']: if event_data['group'] == 'NFL' and event_data['tags'][3] == 'MATCH': competition = event_data['group'] event_id = event_data['id'] event_name = event_data['name'] event_start = event_data['start'] event_status = event_data['state'] print(competition, event_id, event_name, event_start, event_status)
运行输出
NFL 1018663095 Denver Broncos - Indianapolis Colts 2022-10-07T00:15:00Z NOT_STARTED NFL 1018663094 Buffalo Bills - Pittsburgh Steelers 2022-10-09T17:00:00Z NOT_STARTED NFL 1018663086 Cleveland Browns - Los Angeles Chargers 2022-10-09T17:00:00Z NOT_STARTED NFL 1018663084 Jacksonville Jaguars - Houston Texans 2022-10-09T17:00:00Z NOT_STARTED NFL 1018663083 Minnesota Vikings - Chicago Bears 2022-10-09T17:00:00Z NOT_STARTED NFL 1018663082 New England Patriots - Detroit Lions 2022-10-09T17:00:00Z NOT_STARTED NFL 1018663081 New Orleans Saints - Seattle Seahawks 2022-10-09T17:00:00Z NOT_STARTED NFL 1018667663 New York Jets - Miami Dolphins 2022-10-09T17:00:00Z NOT_STARTED NFL 1018663077 Tampa Bay Buccaneers - Atlanta Falcons 2022-10-09T17:00:00Z NOT_STARTED NFL 1018663074 Washington Commanders - Tennessee Titans 2022-10-09T17:00:00Z NOT_STARTED NFL 1018663073 Carolina Panthers - San Francisco 49ers 2022-10-09T20:05:00Z NOT_STARTED NFL 1018663072 Arizona Cardinals - Philadelphia Eagles 2022-10-09T20:25:00Z NOT_STARTED NFL 1018663069 Los Angeles Rams - Dallas Cowboys 2022-10-09T20:25:00Z NOT_STARTED NFL 1018663039 Baltimore Ravens - Cincinnati Bengals 2022-10-10T00:20:00Z NOT_STARTED NFL 1018663037 Kansas City Chiefs - Las Vegas Raiders 2022-10-11T00:15:00Z NOT_STARTED Traceback (most recent call last): File "C:\Users\xxxxx\OneDrive\Desktop\xxxxx-functions\testing.py", line 44, in <module> event_info() File "C:\Users\xxxxx\OneDrive\Desktop\xxxxx-functions\testing.py", line 23, in event_info if event_data['group'] == 'NFL' and event_data['tags'][3] == 'MATCH': IndexError: list index out of range
数据说明
NFL赛事的JSON数据中,tags字段结构如下:
{ "englishName": "Cleveland Browns - Los Angeles Chargers", "groupId": 1000093656, "homeName": "Cleveland Browns", "groupSortOrder": 2876820019684212736, "path": [ { "englishName": "American Football", "termKey": "american_football", "name": "American Football", "id": 1000093199 }, { "englishName": "NFL", "termKey": "nfl", "name": "NFL", "id": 1000093656 } ], "id": 1018663086, "state": "NOT_STARTED", "group": "NFL", "start": "2022-10-09T17:00:00Z", "nonLiveBoCount": 144, "tags": [ "", "OFFERED_LIVE", "BET_BUILDER", "MATCH" ], "awayName": "Los Angeles Chargers", "name": "Cleveland Browns - Los Angeles Chargers", "sport": "AMERICAN_FOOTBALL" }
但其他联赛(如CFL)的tags列表长度不足,导致索引越界:
{ "englishName": "Montreal Alouettes - Ottawa RedBlacks", "groupId": 1000093370, "homeName": "Montreal Alouettes", "groupSortOrder": 3874820019684212736, "path": [ { "englishName": "American Football", "termKey": "american_football", "name": "American Football", "id": 1000093199 }, { "englishName": "CFL", "termKey": "cfl", "name": "CFL", "id": 1000093370 } ], "id": 1018400365, "state": "NOT_STARTED", "group": "CFL", "start": "2022-10-10T17:00:00Z", "nonLiveBoCount": 3, "tags": [ "OFFERED_LIVE", "BET_BUILDER", "MATCH" ], "awayName": "Ottawa RedBlacks", "name": "Montreal Alouettes - Ottawa RedBlacks", "sport": "AMERICAN_FOOTBALL" }
解决方案
错误根源是:直接通过索引tags[3]获取元素,但部分赛事的tags列表长度不足4,访问索引3触发越界错误。另外,逻辑上应先筛选NFL赛事,再检查tags,避免对非NFL赛事做无效判断。
提供两种优化方案:
方案一:先筛选NFL,再安全检查tags
先锁定NFL赛事,再判断tags长度是否足够,且目标元素为MATCH:
for event_data in data['events']: # 先筛选NFL赛事 if event_data['group'] == 'NFL': # 检查tags列表长度足够,且第4个元素是MATCH if len(event_data['tags']) >=4 and event_data['tags'][3] == 'MATCH': competition = event_data['group'] event_id = event_data['id'] event_name = event_data['name'] event_start = event_data['start'] event_status = event_data['state'] print(competition, event_id, event_name, event_start, event_status)
方案二:直接检查tags是否包含'MATCH'
如果MATCH标签的位置不固定,用in判断存在性更稳妥:
for event_data in data['events']: if event_data['group'] == 'NFL' and 'MATCH' in event_data['tags']: competition = event_data['group'] event_id = event_data['id'] event_name = event_data['name'] event_start = event_data['start'] event_status = event_data['state'] print(competition, event_id, event_name, event_start, event_status)
两种方案都能避免索引越界,方案二更灵活,即使MATCH在tags中的位置变化也不会出错。
内容的提问来源于stack exchange,提问作者DrewS
相关产品推荐
相关产品推荐

