为何代码报'list index out of range'错误?多词姓名提取问题排查
解决列表索引越界错误并优化姓名提取逻辑
让我来帮你搞定这个list index out of range的问题,顺便把代码逻辑捋得更顺畅:
错误原因分析
你遇到的索引越界问题主要来自这几个地方:
nameList长度不匹配:你用[[] for i in range(1, len(allLines))]创建nameList,它的长度是len(allLines)-1,但后面的循环却遍历了全部len(allLines)行数据。当循环到最后一行时,nameList[i]就会超出列表的最大索引范围。- 未跳过表头行:第一行是表头数据,不是玩家信息,直接处理它不仅没用,还可能导致后续逻辑出现异常。
- 姓名提取逻辑不够灵活:
range(1, l-3)的写法只能适配固定长度的姓名,如果遇到更长的姓名(比如三个字的全名),就会漏取部分内容。
修正后的代码方案
方案一:提前存储所有姓名(保留你的原有思路)
_ID = "000001234" # 使用with语句自动管理文件,无需手动关闭 with open("Players.txt", "r") as f: allLines = f.readlines() nameList = [] # 从第二行开始处理,跳过表头 for line in allLines[1:]: splitLine = line.strip().split() # 用切片提取姓名:从第2个元素到倒数第3个元素(最后三个是年龄、身高、体重) name_parts = splitLine[1:-3] nameList.append(name_parts) # 查找目标ID对应的姓名 for idx, line in enumerate(allLines[1:]): splitLine = line.strip().split() if splitLine[0] == _ID: print(nameList[idx]) break
方案二:直接查找并提取(更简洁高效)
如果不需要存储所有姓名,直接在遍历的时候查找目标ID并提取姓名会更省内存:
_ID = "000001234" with open("Players.txt", "r") as f: # 跳过第一行表头 next(f) for line in f: splitLine = line.strip().split() if splitLine[0] == _ID: # 拼接姓名为完整字符串输出 full_name = " ".join(splitLine[1:-3]) print(full_name) break
关键修改点说明
- 文件处理优化:用
with语句打开文件,Python会自动在代码块结束后关闭文件,避免手动关闭可能出现的遗漏。 - 跳过表头:通过
allLines[1:]或者next(f)直接跳过第一行的标题数据,只处理有效玩家信息。 - 姓名提取逻辑:用
splitLine[1:-3]切片操作,不管姓名有几个单词,都能准确提取出所有姓名部分(只要最后三个字段固定是年龄、身高、体重)。 - 索引匹配修正:方案一中遍历
allLines[1:]来填充nameList,确保后续查找时索引完全对应,不会出现越界问题。
测试一下,如果把_ID改成"000000001",方案一会输出['Aaron', 'Appindangoye'],方案二则会输出Aaron Appindangoye,都能准确提取姓名。
内容的提问来源于stack exchange,提问作者Abhishek Sharma
相关产品推荐
相关产品推荐

