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

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.")

问题分析

初始代码的核心问题

  1. return语句缩进错误:return results写在了for循环内部,导致循环仅执行一次(处理第一组数据)就直接返回,后续所有数据都未被处理。
  2. 比分逻辑错误:当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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:25:53