You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python按成对规则合并字典列表指定字段的实现及索引错误排查

问题与解决方案:合并成对比赛数据字典列表

作为Python和Stack Overflow的新手,你遇到的问题很典型——需要把按「客队+主队」成对排列的字典列表,提取部分字段合并成新的字典,而不是合并整个字典。你的代码出现了索引错误,我们来一步步排查并优化。

问题回顾

你有一个按比赛对排序的字典列表(先客队后主队),需要每两个(0+1、2+3…)合并成一个新字典:

示例输入

games_detailed = [{'gameId': '8133', 'teamId': '26', 'fastBreakPoints': '16', 'pointsInPaint': '40', 'biggestLead': '15', 'secondChancePoints': '16', 'pointsOffTurnovers': '24', 'longestRun': '9', 'points': '116', 'fgm': '42', 'fga': '92', 'fgp': '45.7', 'ftm': '20', 'fta': '29', 'ftp': '69.0', 'tpm': '12', 'tpa': '42', 'tpp': '28.6', 'offReb': '10', 'defReb': '39', 'totReb': '49', 'assists': '26', 'pFouls': '28', 'steals': '10', 'turnovers': '15', 'blocks': '8', 'plusMinus': '4', 'min': '240:00', 'homeWin': '0', 'homeLoss': '0', 'home': '0', 'teamName': 'Orlando Magic'}, {'gameId': '8133', 'teamId': '1', 'fastBreakPoints': '14', 'pointsInPaint': '32', 'biggestLead': '4', 'secondChancePoints': '25', 'pointsOffTurnovers': '22', 'longestRun': '8', 'points': '112', 'fgm': '34', 'fga': '92', 'fgp': '37.0', 'ftm': '34', 'fta': '41', 'ftp': '82.9', 'tpm': '10', 'tpa': '32', 'tpp': '31.2', 'offReb': '19', 'defReb': '42', 'totReb': '61', 'assists': '20', 'pFouls': '25', 'steals': '8', 'turnovers': '23', 'blocks': '4', 'plusMinus': '-4', 'min': '240:00', 'homeWin': '0', 'homeLoss': '1', 'home': '1', 'teamName': 'Atlanta Hawks'}, {'gameId': '8134', 'teamId': '24', 'fastBreakPoints': '11', 'pointsInPaint': '52', 'biggestLead': '18', 'secondChancePoints': '17', 'pointsOffTurnovers': '19', 'longestRun': '14', 'points': '90', 'fgm': '38', 'fga': '83', 'fgp': '45.8', 'ftm': '9', 'fta': '19', 'ftp': '47.4', 'tpm': '5', 'tpa': '23', 'tpp': '21.7', 'offReb': '13', 'defReb': '41', 'totReb': '54', 'assists': '23', 'pFouls': '28', 'steals': '12', 'turnovers': '24', 'blocks': '6', 'plusMinus': '6', 'min': '240:00', 'homeWin': '0', 'homeLoss': '0', 'home': '0', 'teamName': 'New York Knicks'}, {'gameId': '8134', 'teamId': '10', 'fastBreakPoints': '11', 'pointsInPaint': '30', 'biggestLead': '7', 'secondChancePoints': '9', 'pointsOffTurnovers': '24', 'longestRun': '14', 'points': '84', 'fgm': '26', 'fga': '80', 'fgp': '32.5', 'ftm': '22', 'fta': '25', 'ftp': '88.0', 'tpm': '10', 'tpa': '39', 'tpp': '25.6', 'offReb': '10', 'defReb': '31', 'totReb': '41', 'assists': '17', 'pFouls': '18', 'steals': '12', 'turnovers': '22', 'blocks': '3', 'plusMinus': '-6', 'min': '240:00', 'homeWin': '0', 'homeLoss': '1', 'home': '1', 'teamName': 'Detroit Pistons'}]

预期输出

{'gameId' : '8133', 'away_team' : 'Orlando Magic', 'away_points' : '116', 'home_team' : 'Atlanta Hawks', 'home_points' : '112', 'spread' : '-4', 'home_win' : '0', 'home_loss' : 1}

原代码错误排查

你的代码出现索引错误,主要有以下几个问题:

  1. 索引越界问题
    你用i从1开始递增,遍历每个元素时访问games_detailed[i-1]。当循环到最后一个元素时,i会变成len(games_detailed)+1,此时games_detailed[i-1]就会超出列表的最大索引,触发IndexError。

  2. count计算逻辑错误
    处理主队时,你用int(i/2)计算要更新的game_list索引,但这个逻辑不对。比如处理第二个主队(原列表索引3)时,i=4,int(4/2)=2,但此时game_list只有1个元素(索引0),访问game_list[2]就会导致索引错误。

  3. 冗余的字典创建
    处理主队时重新创建temp_dict是多余的,直接构造要更新的键值对即可,这样既浪费内存,也增加了逻辑复杂度。

代码优化方案

既然数据是严格按「客队+主队」成对排列的,我们可以直接按步长为2的循环,成对取出客队和主队字典,一次性构造合并后的新字典,逻辑更清晰,也避免了索引错误:

games_detailed = [{'gameId': '8133', 'teamId': '26', 'fastBreakPoints': '16', 'pointsInPaint': '40', 'biggestLead': '15', 'secondChancePoints': '16', 'pointsOffTurnovers': '24', 'longestRun': '9', 'points': '116', 'fgm': '42', 'fga': '92', 'fgp': '45.7', 'ftm': '20', 'fta': '29', 'ftp': '69.0', 'tpm': '12', 'tpa': '42', 'tpp': '28.6', 'offReb': '10', 'defReb': '39', 'totReb': '49', 'assists': '26', 'pFouls': '28', 'steals': '10', 'turnovers': '15', 'blocks': '8', 'plusMinus': '4', 'min': '240:00', 'homeWin': '0', 'homeLoss': '0', 'home': '0', 'teamName': 'Orlando Magic'}, {'gameId': '8133', 'teamId': '1', 'fastBreakPoints': '14', 'pointsInPaint': '32', 'biggestLead': '4', 'secondChancePoints': '25', 'pointsOffTurnovers': '22', 'longestRun': '8', 'points': '112', 'fgm': '34', 'fga': '92', 'fgp': '37.0', 'ftm': '34', 'fta': '41', 'ftp': '82.9', 'tpm': '10', 'tpa': '32', 'tpp': '31.2', 'offReb': '19', 'defReb': '42', 'totReb': '61', 'assists': '20', 'pFouls': '25', 'steals': '8', 'turnovers': '23', 'blocks': '4', 'plusMinus': '-4', 'min': '240:00', 'homeWin': '0', 'homeLoss': '1', 'home': '1', 'teamName': 'Atlanta Hawks'}, {'gameId': '8134', 'teamId': '24', 'fastBreakPoints': '11', 'pointsInPaint': '52', 'biggestLead': '18', 'secondChancePoints': '17', 'pointsOffTurnovers': '19', 'longestRun': '14', 'points': '90', 'fgm': '38', 'fga': '83', 'fgp': '45.8', 'ftm': '9', 'fta': '19', 'ftp': '47.4', 'tpm': '5', 'tpa': '23', 'tpp': '21.7', 'offReb': '13', 'defReb': '41', 'totReb': '54', 'assists': '23', 'pFouls': '28', 'steals': '12', 'turnovers': '24', 'blocks': '6', 'plusMinus': '6', 'min': '240:00', 'homeWin': '0', 'homeLoss': '0', 'home': '0', 'teamName': 'New York Knicks'}, {'gameId': '8134', 'teamId': '10', 'fastBreakPoints': '11', 'pointsInPaint': '30', 'biggestLead': '7', 'secondChancePoints': '9', 'pointsOffTurnovers': '24', 'longestRun': '14', 'points': '84', 'fgm': '26', 'fga': '80', 'fgp': '32.5', 'ftm': '22', 'fta': '25', 'ftp': '88.0', 'tpm': '10', 'tpa': '39', 'tpp': '25.6', 'offReb': '10', 'defReb': '31', 'totReb': '41', 'assists': '17', 'pFouls': '18', 'steals': '12', 'turnovers': '22', 'blocks': '3', 'plusMinus': '-6', 'min': '240:00', 'homeWin': '0', 'homeLoss': '1', 'home': '1', 'teamName': 'Detroit Pistons'}]

game_list = []
# 按步长2循环,每次取出一对客队和主队
for i in range(0, len(games_detailed), 2):
    away_team = games_detailed[i]
    home_team = games_detailed[i+1]
    # 直接构造合并后的字典
    merged_game = {
        'gameId': away_team['gameId'],
        'away_team': away_team['teamName'],
        'away_points': away_team['points'],
        'home_team': home_team['teamName'],
        'home_points': home_team['points'],
        'spread': home_team['plusMinus'],
        'home_win': home_team['homeWin'],
        'home_loss': int(home_team['homeLoss'])  # 匹配预期输出的整数类型
    }
    game_list.append(merged_game)

# 验证结果
for game in game_list:
    print(game)

优化后的优势

  • 逻辑清晰:直接成对处理数据,不需要额外跟踪索引和计算count,降低出错概率。
  • 代码简洁:一次性构造目标字典,避免了冗余的字典创建和更新操作。
  • 可读性强:变量名明确(away_team、home_team),一眼就能看懂代码意图。

内容的提问来源于stack exchange,提问作者jpetrantoni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:12:59