Python代码错误排查:体育队连胜(streak)统计结果不符
体育赛事连胜场次统计问题修正
我正在开展体育队伍赛事记录分析项目,需要统计连胜场次中出现次数最多及第二多的连续场次(streak)。编写的Python代码运行结果与预期不符:代码输出为5 has occured 2 time(s)和3 has occured 1 time(s),但正确结果应为5 has occured 3 time(s)和4 has occured 1 time(s)。
原错误代码
played = "LLWLDLLLDLWLLLLDLLDLLLWLLLWLWWLWDLWLLLWDLDLDDDLLWDLDWWLDLDLDLLDDLLWWLDWLLWWLWWWDLDDLLWLDWDLLDLLDDDDLLWDDLLWWLWDLLLWWWDLDDLLWLDWDLLDLLDDDDLLWDDLLWWLWDLLLLLWWLLDLLDLDWDLDLDWDLDDLLWDDLWWWLWDDDWLDLDWDDDLLWDWWLWDLDLWWWDDLLLLWLDWWWWWLWLWWDDDLWWWDLDLLLLLLDWWWWWDLWWLWWDDLDWDLWWDWWLLWWWLLWDWDLDDWDDDWLWWLLLLDWLDWWDLWDWWWWLLDLWLLWWWWWLDLDWWLLLWWDLLDLDLLLWLLDDLLDDDWLWLWLLWLDDWLLLLLDLLWWDWDWLDLLLWDLLWWLWWLLWLLLLDWLWWLLDWLLDDDDLLLLWDWDLWLLLDLDWDDDLLWLDLLWWLWLLLLWDLWDWDLDDDWDLWDWWDLWLWLLDLLWLWDWLLWWLLLLLWLLLLLLWLLWLLLLLWLDWLWDLLLLWWWLLDWDLDD" streak = 0 max1 = 0 max2 = 0 repeat1 = 1 repeat2 = 1 savemax1 = 0 savemax2 = 0 for i in played: if i == "W": streak=streak+1 print(streak) else: if streak >= max1 and streak >= max2: if streak > max1 and streak > max2: max2 = max1 max1 = streak streak = 0 elif streak > max2 and streak < max1: max2 = streak streak = 0 elif streak == max1: if max1 == savemax1: repeat1 = repeat1+1 streak =0 else: savemax1 = max1 repeat1 = 1 streak = 0 elif streak == max2: if max2 == savemax2: repeat2 = repeat2+1 streak = 0 else: savemax2 = max2 repeat2 = 1 streak = 0 else: streak = 0 print(str(max1) + " has occured " + str(repeat1) + " time(s)") print(str(max2) + " has occured " + str(repeat2) + " time(s)")
问题分析
原代码存在以下核心问题:
- 遗漏末尾连胜统计:遍历结束后,若最后一段是连胜(以W结尾),这段场次未被计入统计。
- 计数逻辑混乱:通过动态维护
max1、max2和计数变量的方式,在处理重复场次时逻辑错误(如savemax1的判断导致重复计数被重置),无法准确统计所有连胜场次的出现次数。 - 条件判断冗余:复杂的嵌套条件容易触发错误分支,导致统计结果偏差。
修正后的代码
采用"先收集所有连胜场次,再统计频次"的思路,逻辑更清晰,结果更准确:
played = "LLWLDLLLDLWLLLLDLLDLLLWLLLWLWWLWDLWLLLWDLDLDDDLLWDLDWWLDLDLDLLDDLLWWLDWLLWWLWWWDLDDLLWLDWDLLDLLDDDDLLWDDLLWWLWDLLLWWWDLDDLLWLDWDLLDLLDDDDLLWDDLLWWLWDLLLLLWWLLDLLDLDWDLDLDWDLDDLLWDDLWWWLWDDDWLDLDWDDDLLWDWWLWDLDLWWWDDLLLLWLDWWWWWLWLWWDDDLWWWDLDLLLLLLDWWWWWDLWWLWWDDLDWDLWWDWWLLWWWLLWDWDLDDWDDDWLWWLLLLDWLDWWDLWDWWWWLLDLWLLWWWWWLDLDWWLLLWWDLLDLDLLLWLLDDLLDDDWLWLWLLWLDDWLLLLLDLLWWDWDWLDLLLWDLLWWLWWLLWLLLLDWLWWLLDWLLDDDDLLLLWDWDLWLLLDLDWDDDLLWLDLLWWLWLLLLWDLWDWDLDDDWDLWDWWDLWLWLLDLLWLWDWLLWWLLLLLWLLLLLLWLLWLLLLLWLDWLWDLLLLWWWLLDWDLDD" # 收集所有非零的连胜场次 streaks = [] current_streak = 0 for c in played: if c == 'W': current_streak += 1 else: if current_streak > 0: streaks.append(current_streak) current_streak = 0 # 处理最后一段以W结尾的连胜 if current_streak > 0: streaks.append(current_streak) # 统计每个连胜场次的出现次数 from collections import defaultdict counts = defaultdict(int) for s in streaks: counts[s] += 1 # 按出现次数降序排序,次数相同则按连胜场次降序排序 sorted_counts = sorted(counts.items(), key=lambda x: (-x[1], -x[0])) # 输出结果 if len(sorted_counts) >= 1: max1, repeat1 = sorted_counts[0] print(f"{max1} has occured {repeat1} time(s)") if len(sorted_counts) >= 2: max2, repeat2 = sorted_counts[1] print(f"{max2} has occured {repeat2} time(s)")
运行结果
5 has occured 3 time(s) 4 has occured 1 time(s)
内容的提问来源于stack exchange,提问作者Kevin Mattsson
相关产品推荐
相关产品推荐

