Python按积分、净胜球从球队字典列表选最佳球队的问题排查
问题排查:足球联赛最佳球队计算逻辑错误
问题场景
需求规则:从球队列表中返回最佳球队名称,优先比较积分(wins*3 + draws),积分相同则比较净胜球(scored - conceded)。但当前代码返回Barcelona,预期结果应为Real Madrid,需排查代码问题。
用户代码
def football_league(teams): best_team = max(teams, key=lambda k: k["wins"]*3 + k["draws"]) if len(best_team)>1: best_team = max(teams, key=lambda k: k["scored"] - k["conceded"]) return best_team["name"] else: return best_team["name"] la_liga = [ { "name": "Sevilha", "wins": 18, "loss": 10, "draws": 10, "scored": 60, "conceded": 10, }, { "name": "Barcelona", "wins": 22, "loss": 8, "draws": 8, "scored": 88, "conceded": 20, }, { "name": "Real Madrid", "wins": 22, "loss": 8, "draws": 8, "scored": 98, "conceded": 29, }, { "name": "Atletico Madrid", "wins": 22, "loss": 8, "draws": 8, "scored": 90, "conceded": 30, } ] print(football_league(la_liga))
问题分析
代码存在两个核心逻辑错误:
- 错误判断同积分球队数量:
max(teams, key=...)返回的是单个球队字典,len(best_team)计算的是该字典的键值对数量(比如Barcelona的字典有6个键,所以len=6),这个判断完全无法检测是否存在多个积分相同的顶级球队。 - 错误的净胜球比较范围:即便进入分支,代码是对所有球队取净胜球最大的,而非仅在积分最高的球队中筛选,这违反了“积分相同才比净胜球”的规则。
另外,当多个球队积分相同时,max会返回列表中第一个出现的球队(也就是Barcelona),这也是初始best_team为Barcelona的原因,但后续分支逻辑并未正确处理同积分场景。
修正方案
方案一:分步筛选(逻辑清晰)
先筛选出积分最高的球队,再在其中找净胜球最大的:
def football_league(teams): # 计算最高积分值 max_points = max(team["wins"]*3 + team["draws"] for team in teams) # 筛选所有积分达标的球队 top_teams = [team for team in teams if team["wins"]*3 + team["draws"] == max_points] # 在顶级球队中按净胜球排序 best_team = max(top_teams, key=lambda k: k["scored"] - k["conceded"]) return best_team["name"]
方案二:元组key一步到位(简洁高效)
利用Python元组的比较特性(先比第一个元素,再比第二个),直接用(积分, 净胜球)作为排序key:
def football_league(teams): best_team = max(teams, key=lambda k: (k["wins"]*3 + k["draws"], k["scored"] - k["conceded"])) return best_team["name"]
两种方案运行后都会返回预期的Real Madrid。
内容的提问来源于stack exchange,提问作者Manuel Carvalhinha
相关产品推荐
相关产品推荐

