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

Python如何通过循环遍历列表嵌套字典的ELO值,实现两两交叉比对计算篮球球队预期胜率

ELO预期胜率计算(嵌套字典列表场景)实现方案

报错根因

当前eList的结构是每个列表元素为仅含单键值对的字典,直接把字典对象传入数值计算函数、或是未正确提取字典内的ELO值做运算,是嵌套循环触发类型报错的核心原因。

实现步骤

  1. 结构化预处理嵌套字典
    先遍历嵌套字典列表,把每个字典里的球队名、对应ELO值提取为二元组存储,避免后续交叉遍历时反复拆解嵌套字典,提升运行效率:
    # 拆解eList为(球队名, ELO评分)形式的列表
    team_elo = []
    for single_dict in eList:
        team_name, elo_value = list(single_dict.items())[0]
        team_elo.append((team_name, elo_value))
    
  2. 无重复交叉配对遍历
    不要全量双层遍历所有索引,否则会出现重复计算同一组对阵、甚至球队和自身匹配计算的冗余问题;第二层循环从当前遍历位置的后一个元素开始,仅计算一次每组球队的对阵胜率。
  3. 调用自定义胜率函数输出结果
    完整可运行代码:
    import math
    
    def expected_result(rating1, rating2):
        exp = (rating2 - rating1)/400.
        Ea = 1/(1 + math.pow(10, exp))
        Eb = 1/(1 + math.pow(10, -exp))
        return Ea*100, Eb*100
    
    # 题目给定的示例eList
    eList=[{'Perth': 1715}, {'Melbourne': 1683}, {'Phoenix': 1648}, {'Sydney': 1605}, {'The Hawks': 1573}, {'Brisbane': 1573}, {'Adelaide': 1523}, {'New Zealand': 1520}, {'Cairns': 1477}]
    
    # 预处理结构化数据
    team_elo = []
    for single_dict in eList:
        team, score = list(single_dict.items())[0]
        team_elo.append((team, score))
    
    # 交叉计算并输出
    for i in range(len(team_elo)):
        team1, r1 = team_elo[i]
        for j in range(i+1, len(team_elo)):
            team2, r2 = team_elo[j]
            win1, win2 = expected_result(r1, r2)
            print(f"{team1} 对阵 {team2}:{team1}预期胜率 {win1:.1f}%,{team2}预期胜率 {win2:.1f}%")
    

注意事项

  • 传入expected_result的两个参数必须是数值型的ELO评分,不能直接传字典对象
  • 若需要保留所有双向对阵的计算结果(即同一组对阵算两次,分别输出不同视角的胜率),可将第二层循环的起始值改为0,跳过j==i的自身匹配逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 05:36:04