Python程序遇IndexError:求句子最长同长连续词链问题求助
问题分析与修复
索引越界的原因
你遇到的IndexError是因为当x指向列表最后一个元素时,x+1超出了列表的索引范围。列表的索引从0开始,比如有n个元素的列表,最大有效索引是n-1。你的循环会遍历len(words)次,当x增加到len(words)-1时,执行words[x+1]就会访问不存在的索引,触发越界错误。
另外你的代码还有两个逻辑缺陷:
- 循环遍历
words的每个元素i,但完全没用到i,属于无效遍历,还会导致循环次数过多 - 只维护了当前连续长度的单词链,没有记录遍历过程中出现的最长链,最终输出的可能不是真正的最长结果(比如你给出的示例输入,你的代码最后会得到
["to", "be"],而不是正确的["To", "be", "or"])
修复后的代码
text = input("Enter text: ") # 处理标点,转为单词列表(可扩展处理更多标点) words = text.replace(",", " ").replace(".", " ").replace("!", " ").replace("?", " ").split() # 边界情况处理 if not words: print("No words entered.") exit() # 初始化最长链和当前链,初始为第一个单词 longest_chain = [words[0]] current_chain = [words[0]] # 从第二个单词开始遍历 for word in words[1:]: # 比较当前单词和当前链最后一个单词的长度 if len(word) == len(current_chain[-1]): current_chain.append(word) # 如果当前链比最长链长,更新最长链 if len(current_chain) > len(longest_chain): longest_chain = current_chain.copy() else: # 长度不同,重置当前链为当前单词 current_chain = [word] # 格式化输出结果 print("Longest chain of words with similar length: ", ", ".join(longest_chain))
代码改进说明
- 避免索引越界:通过遍历
words[1:](从第二个单词开始),每次和current_chain[-1](当前链的最后一个单词)比较长度,完全不需要手动维护索引x,从根源避免了索引越界问题。 - 记录最长链:同时维护
current_chain(当前连续长度的单词链)和longest_chain(遍历过程中最长的链),每次当前链变长时,就更新最长链。 - 边界情况处理:增加了空输入的判断,避免后续代码报错。
- 结果格式化:用
", ".join()把列表转为符合示例要求的字符串格式。
测试你的示例输入"To be or not to be",会输出:Longest chain of words with similar length: To, be, or,符合预期。
内容的提问来源于stack exchange,提问作者Dan_the_Man
相关产品推荐
相关产品推荐

