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会超出列表最大下标,建议增加长度校验。
修复方案
- 初始化
quartis时预留3个元素的位置,适配你后续按索引赋值的逻辑:
quartis = [0.0] * 3
- 将固定79次的循环改为动态遍历所有读入的行,适配不同长度的输入文件:
for i in range(len(dadosemarray)): dadosemarray[i] = int(dadosemarray[i].strip())
- 修正中位数调用方式,改为
statistics.median(dadosemarray),或在导入语句中增加from statistics import median。 - 增加数据集长度校验逻辑,避免长度不足导致的计算异常。
完整修正后代码
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
相关产品推荐
相关产品推荐

