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

Python MapReduce场景下IndexError: list index out of range问题求助

解决MapReduce Mapper脚本中的IndexError问题

咱们先来拆解你遇到的IndexError: list index out of range错误——这个问题出在market_value = int(data[2])这一行,说明当你用line.split("\t")分割某一行文本后,得到的data列表长度小于3,自然就取不到索引为2的元素了。下面是具体的原因分析和修复方案:

主要错误原因

  • 分隔符不匹配:你的数据集样例里,字段是用空格分隔的(比如1 Alexis Sanchez 65),但脚本里用的是split("\t")(制表符分割)。这会导致每一行分割后得到的列表完全不符合预期,比如第一行数据会被拆成['1 Alexis Sanchez 65'],长度只有1,肯定取不到data[2]。
  • 未处理表头行:数据集的第一行是表头name market_value,就算分隔符正确,这一行分割后也没有第三个元素,同样会触发索引错误。
  • 固定索引的隐患:有些球员姓名包含空格(比如Alexis Sanchez),就算用空格分割,data[2]也不一定是市值字段,反而会是姓名的一部分。

修复后的Mapper脚本

#!/usr/bin/env python
import sys

myList = []
n = 10  # Number of top N records

for line in sys.stdin:
    line = line.strip()
    # 跳过空行和表头行
    if not line or line.startswith('name'):
        continue
    # 用默认split()按任意空白符分割(适配空格/制表符,自动处理多空格)
    data = line.split()
    # 确保分割后至少有足够元素(序号、姓名、市值)
    if len(data) < 3:
        continue
    try:
        # 取最后一个元素作为市值(避免姓名带空格的问题)
        market_value = int(data[-1])
    except ValueError:
        continue
    # 将市值和整行内容加入列表
    myList.append( (market_value, line) )
    # 降序排序并保留前N个元素
    myList.sort(reverse=True)
    if len(myList) > n:
        myList = myList[:n]

# 打印最终的前N条记录
for (k, v) in myList:
    print(v)

关键修复点说明

  1. 适配分隔符:用split()代替split("\t"),它会自动处理任意数量的空白符(包括多个空格、制表符),完美适配你的数据集格式。
  2. 过滤无效行:通过判断跳过空行和表头,避免无意义的处理。
  3. 安全获取市值:用data[-1]取最后一个元素作为市值,解决了姓名包含空格导致的字段偏移问题。
  4. 增加长度校验:在转换数值前先检查分割后的列表长度,从源头避免索引错误。

运行这个修复后的脚本,应该就能正常提取出数据集中的前10大市值记录了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:24:16