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

Python计算四分位数报IndexError,按索引逻辑不应出现越界

报错原因分析
  • 核心触发点:你初始化了空列表quartis = [],Python列表不支持直接给不存在的索引位置赋值,空列表不存在下标为0、1、2的元素,所以执行quartis[0] = xxx时直接触发越界错误。
  • 潜在错误1:数据处理逻辑写死了循环79次,如果dados.txt的行数不足79,处理dadosemarray[i]时也会触发索引越界。
  • 潜在错误2:代码中直接调用median()函数,但你仅导入了statistics模块没有单独导入median方法,运行时会触发NameError。
  • 潜在错误3:计算四分位数时如果数据集长度小于4,int(t/4)+1会超出列表最大下标,建议增加长度校验。
修复方案
  1. 初始化quartis时预留3个元素的位置,适配你后续按索引赋值的逻辑:
quartis = [0.0] * 3
  1. 将固定79次的循环改为动态遍历所有读入的行,适配不同长度的输入文件:
for i in range(len(dadosemarray)):
    dadosemarray[i] = int(dadosemarray[i].strip())
  1. 修正中位数调用方式,改为statistics.median(dadosemarray),或在导入语句中增加from statistics import median。
  2. 增加数据集长度校验逻辑,避免长度不足导致的计算异常。
完整修正后代码
import seaborn as sb
import statistics

dadosemarray = []
# 初始化预留3个位置存储三个四分位数
quartis = [0.0] * 3
percentis = []

with open("dados.txt", "r") as dados:
        dadosemarray = dados.readlines()

# 动态处理所有读入的数据行
for i in range(len(dadosemarray)):
    dadosemarray[i] = int(dadosemarray[i].strip())

# 校验数据集最小长度
if len(dadosemarray) < 4:
    raise ValueError("数据集长度至少需要4个元素才能完成四分位数计算")

t = len(dadosemarray) - 1
    
quartis[0] = dadosemarray[int(t/4)] + 0.75*(dadosemarray[int(t/4) + 1] - dadosemarray[int(t/4)])
quartis[1] = statistics.median(dadosemarray)
quartis[2] = dadosemarray[int((3*t)/4)] + 0.25*(dadosemarray[int((3*t)/4) + 1] - dadosemarray[int((3*t)/4)])
percentis = statistics.quantiles(dadosemarray, n=100)

print("quartis: {}".format(quartis))
assimetria = (quartis[0] + quartis [2] - 2*quartis[1])/(quartis[0] - quartis[2])
curtose = (quartis[2] - quartis[0])/(2*(percentis[89] - percentis[9]))

sb.boxplot(x=dadosemarray)

def curtosefun(valor):
    if valor > 0.263:
        print("A curtose de valor {} é leptocúrtica".format(curtose))
    elif valor < 0.263:
        print("A curtose de valor {} é platicúrtica".format(curtose))
    else:
        print("A curtose de valor {} é mesocúrtica".format(curtose))
        
def assimetriafun(valor):
    if valor > 0:
        print("O coeficiente de simetria de valor {} representa uma distribuição assimétrica negativa (à direita)".format(assimetria))
    elif valor < 0:
        print("O coeficiente de simetria de valor {} representa uma distribuição assimétrica negativa (à esquerda)".format(assimetria))
    else:
        print("O coeficiente de simetria de valor {} é simétrica".format(assimetria))

curtosefun(curtose) 
assimetriafun(assimetria)

如果后续需要手动实现百分位数计算,只需要替换statistics.quantiles的调用逻辑即可,原有四分位数计算逻辑已完全保留,没有引入额外第三方库的统计方法。

内容的提问来源于stack exchange,提问作者ricsrdo.casro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:57:02