Python选手得分转比分比例错误及代码异常问题求助
修正Python选手比分转换脚本的错误
问题描述
编写Python脚本读取选手得分数据并转换为比分比例以支持统计分析,但输出结果存在错误:部分比分与输入数据相反,甚至出现无依据的错误比分。推测问题出在transform_results函数,可能是比较逻辑错误或选手/得分顺序未正确维护。修改后的代码还出现了索引越界异常。
输入数据
Player1 1 Player2 1 ------------------------------------------- Player3 5 Player4 1 ------------------------------------------- Player4 2 Player1 3 ------------------------------------------- Player2 2 Player5 1 ------------------------------------------- Player5 2 Player4 3 ------------------------------------------- Player1 3 Player3 1 ------------------------------------------- Player3 2 Player5 3 ------------------------------------------- Player4 3 Player2 1 ------------------------------------------- Player2 3 Player1 2 ------------------------------------------- Player4 1 Player3 4 ------------------------------------------- Player1 3 Player4 2 ------------------------------------------- Player5 3 Player2 4 ------------------------------------------- Player4 3 Player5 2 ------------------------------------------- Player3 3 Player1 4 ------------------------------------------- Player5 3 Player3 2 ------------------------------------------- Player2 1 Player4 4 ------------------------------------------- Player3 5 Player2 2 ------------------------------------------- Player1 1 Player5 2 -------------------------------------------
错误输出结果(标记错误项)
Player1 Player2 1:1 Player3 Player4 5:1 Player4 Player1 3:2 i Player2 Player5 2:1 Player5 Player4 3:2 i Player1 Player3 3:1 Player3 Player5 3:2 i Player4 Player2 3:1 Player2 Player1 3:2 Player4 Player3 4:1 i Player1 Player4 3:1 i! Player5 Player2 4:3 i Player4 Player5 3:2 Player3 Player1 4:3 i Player5 Player3 3:2 Player2 Player4 4:1 i Player3 Player2 5:2 Player1 Player5 2:1 i
初始代码
# Function to read data from a text file def read_data_from_file(file_name): data = [] with open(file_name, 'r') as file: for line in file: line = line.strip() if line and not line.startswith('-'): data.append(line.split()) return data # Function to convert direct results to ratio def transform_results(data): results = [] for i in range(0, len(data), 2): player1, score1 = data[i][0], data[i][1] player2, score2 = data[i + 1][0], data[i + 1][1] if player1 != player2: if score1 > score2: ratio = f"{score1}:{score2}" else: ratio = f"{score2}:{score1}" results.append([player1, player2, ratio]) return results # Function to write results to a text file def write_results_to_file(results, file_name): with open(file_name, 'w') as file: for row in results: file.write(' '.join(row) + '\n') # File paths input_file = 'C:/Users/M/Desktop/Test.txt' output_file = 'C:/Users/M/Desktop/Results.txt' # Read data from input file data = read_data_from_file(input_file) # Transform results into ratio results = transform_results(data) # Write results to output file write_results_to_file(results, output_file) print("Transformation of results completed successfully.")
修改后代码的运行异常
>>> # Function to read data from a text file >>> def read_data_from_file(file_name): ... data = [] ... with open(file_name, 'r') as file: ... for line in file: ... line = line.strip() ... if line and not line.startswith('-'): ... data.append(line.split()) ... return data ... >>> # Function to convert direct results to ratio >>> def transform_results(data): ... results = [] ... for i in range(0, len(data)): ... player1, score1 = data[i][0], data[i][1] ... player2, score2 = data[i][2], data[i][3] ... if not player1 == player2: ... if score1 > score2: ... ratio = f"{score1}:{score2}" ... results.append([player1, player2, ratio]) ... else: ... ratio = f"{score2}:{score1}" ... results.append([player2, player1, ratio]) ... return results ... >>> # Function to write results to a text file >>> def write_results_to_file(results, file_name): ... with open(file_name, 'w') as file: ... for row in results: ... file.write(' '.join(row) + '\n') ... >>> # File paths >>> input_file = 'C:/Users/M/Desktop/Test.txt' >>> output_file = 'C:/Users/M/Desktop/Results.txt' >>> >>> # Read data from input file >>> data = read_data_from_file(input_file) >>> results = transform_results(data) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 5, in transform_results IndexError: list index out of range >>> write_results_to_file(results, output_file) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'results' is not defined >>> >>> print("Transformation of results completed successfully.")
问题分析
初始代码的核心问题
- return语句缩进错误:
return results写在了for循环内部,导致循环仅执行一次(处理第一组数据)就直接返回,后续所有数据都未被处理。 - 比分逻辑错误:当
score2大于score1时,代码仅修改了比分显示为大值:小值,但未调整选手顺序,导致选手顺序与比分不匹配。比如输入Player4 2、Player1 3,代码输出Player4 Player1 3:2,出现选手得分与比分矛盾的错误。
修改后代码的核心问题
错误假设data中的每个元素包含两组选手数据(即每个列表有4个值),但实际上read_data_from_file返回的data是每行一个列表,每个列表仅包含[选手名, 得分],因此访问data[i][2]和data[i][3]会触发索引越界异常。
修正方案
根据需求,提供两种常见的修正逻辑:
方案1:保持原选手顺序,比分如实显示
严格按照输入的两个选手顺序,比分显示各自的真实得分(比如输入Player4 2、Player1 3,输出Player4 Player1 2:3)。
修正后的transform_results函数:
def transform_results(data): results = [] # 每两个元素为一组比赛数据 for i in range(0, len(data), 2): player1, score1 = data[i][0], int(data[i][1]) player2, score2 = data[i + 1][0], int(data[i + 1][1]) if player1 != player2: # 保持原选手顺序,比分用真实得分比 ratio = f"{score1}:{score2}" results.append([player1, player2, ratio]) return results
方案2:得分高的选手在前,比分按高:低显示
自动将得分高的选手放在前面,比分显示为高得分:低得分(比如输入Player4 2、Player1 3,输出Player1 Player4 3:2)。
修正后的transform_results函数:
def transform_results(data): results = [] # 每两个元素为一组比赛数据 for i in range(0, len(data), 2): player1, score1 = data[i][0], int(data[i][1]) player2, score2 = data[i + 1][0], int(data[i + 1][1]) if player1 != player2: if score1 > score2: results.append([player1, player2, f"{score1}:{score2}"]) elif score2 > score1: results.append([player2, player1, f"{score2}:{score1}"]) else: # 平局时保持原顺序 results.append([player1, player2, f"{score1}:{score2}"]) return results
关键修正点说明
- 将得分转换为
int类型:避免字符串比较导致的错误(比如"10"作为字符串会小于"2")。 - 修正
return语句的缩进:将其放在for循环外部,确保所有数据都被处理。 - 逻辑匹配选手顺序与比分:要么保持原顺序用真实比分,要么调整选手顺序匹配高:低的比分。
完整修正后的代码示例(以方案2为例)
# Function to read data from a text file def read_data_from_file(file_name): data = [] with open(file_name, 'r') as file: for line in file: line = line.strip() if line and not line.startswith('-'): data.append(line.split()) return data # Function to convert direct results to ratio def transform_results(data): results = [] for i in range(0, len(data), 2): player1, score1 = data[i][0], int(data[i][1]) player2, score2 = data[i + 1][0], int(data[i + 1][1]) if player1 != player2: if score1 > score2: results.append([player1, player2, f"{score1}:{score2}"]) elif score2 > score1: results.append([player2, player1, f"{score2}:{score1}"]) else: results.append([player1, player2, f"{score1}:{score2}"]) return results # Function to write results to a text file def write_results_to_file(results, file_name): with open(file_name, 'w') as file: for row in results: file.write(' '.join(row) + '\n') # File paths input_file = 'C:/Users/M/Desktop/Test.txt' output_file = 'C:/Users/M/Desktop/Results.txt' # Read data from input file data = read_data_from_file(input_file) # Transform results into ratio results = transform_results(data) # Write results to output file write_results_to_file(results, output_file) print("Transformation of results completed successfully.")
内容的提问来源于stack exchange,提问作者robertmer
相关产品推荐
相关产品推荐

