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

Python MapReduce统计代码报'string index out of range'错误求助

排查Python代码中'string index out of range'错误并实现数字计数需求

问题背景

你需要统计给定数据中每个整数前缀的出现次数:
原始数据:1 1.45 1 1.153 2 2.179 2 2.206 2 2.59 2 2.111 3 3.201 3 3.175 4 4.228 4 4.161 4 4.213
期望输出:1 2(1出现2次)、2 4、3 2、4 3

但你的代码触发了string index out of range错误,下面来分析原因并给出修正方案。

报错原因分析

你的代码有两个核心问题导致了索引越界:

  1. 分割方式不匹配:原始数据用空格分隔,但你用了line.split('\t')(按制表符分割),这会导致整行数据被当成一个完整的字符串存入num变量。如果数据中存在空白行或空字符串(比如数据末尾的换行),num就会是空值,此时num[0]自然会触发索引越界。
  2. 错误的前缀提取逻辑:你用num[0]取字符串第一个字符来获取整数前缀,这种方式不仅在空字符串时会报错,还无法处理多位数的情况(比如如果有10.5这样的数据,会错误提取成1而非10)。

修正后的解决方案

下面是优化后的代码,直接实现你的需求并避免错误:

data = "1 1.45 1 1.153 2 2.179 2 2.206 2 2.59 2 2.111 3 3.201 3 3.175 4 4.228 4 4.161 4 4.213"
SubPatent2count = {}

# 按任意空白分割数据,自动忽略多余空格和换行
for num_str in data.split():
    # 提取整数前缀:通过小数点分割取第一部分,兼容整数和小数格式
    try:
        sub_patent = num_str.split('.')[0]
        # 验证提取的内容是整数,避免非法数据干扰
        int(sub_patent)
    except (IndexError, ValueError):
        continue  # 遇到无法处理的项直接跳过
    
    # 统计出现次数
    if sub_patent in SubPatent2count:
        SubPatent2count[sub_patent] += 1
    else:
        SubPatent2count[sub_patent] = 1

# 生成符合要求的输出格式
output_parts = []
# 按数字顺序排序输出
for key, count in sorted(SubPatent2count.items(), key=lambda x: int(x[0])):
    if key == '1':
        output_parts.append(f"{key} {count}({key}出现{count}次)")
    else:
        output_parts.append(f"{key} {count}")

print('、'.join(output_parts))

关键修正点

  • 替换split('\t')为split(),正确分割空格分隔的数据;
  • 用num_str.split('.')[0]替代num[0],准确提取每个数字的整数前缀,同时避免空字符串索引错误;
  • 去掉冗余的Mapper_data循环,直接统计,简化逻辑;
  • 增加容错处理,跳过非法数据;
  • 按数字顺序排序,生成你期望的输出格式。

内容的提问来源于stack exchange,提问作者Iriel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:18:52