Python初学者遭遇List Index Out of Range错误求助
问题分析与修复
错误原因
- 索引越界:外层循环条件
i < len(words) - 1会漏掉最后一个单词,且内层循环中i持续递增,当i等于len(words)时,访问words[i]必然触发IndexError。同时内层循环未检查i是否仍在列表范围内,即使外层有条件,也挡不住i超出上限。 - 长度计算逻辑错误:原代码中
size += len(words[i]) + len(phrase_tuple) - 1完全错误,len(phrase_tuple)是结果列表的元素个数,和当前行的长度毫无关系,导致行长度计算完全偏离预期。 - 循环逻辑冗余:外层循环的
else块中额外执行i += 1,会跳过内层循环已经处理过的单词,导致部分单词丢失。
修复后的代码
def corta_texto(phrase, maxlength): words = phrase.split() phrase_tuple = [] phrase_line = '' i = 0 while i < len(words): # 计算加入当前单词后的总长度:非空行需额外加一个空格 next_length = len(phrase_line) + len(words[i]) + (1 if phrase_line else 0) if next_length <= maxlength: # 当前单词可以加入行 if phrase_line: phrase_line += ' ' phrase_line += words[i] i += 1 else: # 当前行已满,存入结果并重置 phrase_tuple.append(phrase_line) phrase_line = '' # 处理最后一行剩余内容 if phrase_line: phrase_tuple.append(phrase_line) return phrase_tuple
修复说明
- 外层循环改为
i < len(words),确保所有单词都被处理,不会遗漏最后一个。 - 直接用
len(phrase_line)跟踪当前行长度,替换原错误的size变量,计算加入单词后的长度时,考虑非空行需要添加空格的情况。 - 移除冗余的
i += 1操作,只有当单词成功加入当前行时才递增索引,避免跳过单词。 - 循环结束后主动检查并加入最后一行剩余内容,防止丢失未完成的行。
内容的提问来源于stack exchange,提问作者mcsmachado
相关产品推荐
相关产品推荐

