Python如何通过循环遍历列表嵌套字典的ELO值,实现两两交叉比对计算篮球球队预期胜率
ELO预期胜率计算(嵌套字典列表场景)实现方案
报错根因
当前eList的结构是每个列表元素为仅含单键值对的字典,直接把字典对象传入数值计算函数、或是未正确提取字典内的ELO值做运算,是嵌套循环触发类型报错的核心原因。
实现步骤
- 结构化预处理嵌套字典
先遍历嵌套字典列表,把每个字典里的球队名、对应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)) - 无重复交叉配对遍历
不要全量双层遍历所有索引,否则会出现重复计算同一组对阵、甚至球队和自身匹配计算的冗余问题;第二层循环从当前遍历位置的后一个元素开始,仅计算一次每组球队的对阵胜率。 - 调用自定义胜率函数输出结果
完整可运行代码: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
相关产品推荐
相关产品推荐

