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错误,下面来分析原因并给出修正方案。
报错原因分析
你的代码有两个核心问题导致了索引越界:
- 分割方式不匹配:原始数据用空格分隔,但你用了
line.split('\t')(按制表符分割),这会导致整行数据被当成一个完整的字符串存入num变量。如果数据中存在空白行或空字符串(比如数据末尾的换行),num就会是空值,此时num[0]自然会触发索引越界。 - 错误的前缀提取逻辑:你用
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
相关产品推荐
相关产品推荐

