如何查找并移除单词列表中总长度为20的单词对及代码修复
解决单词对查找与移除的问题
我来帮你梳理下代码里的问题,然后给出可行的解决方案:
你的代码存在的几个核心问题:
- 索引越界:当你执行
words.pop(i)后,列表长度已经缩短,此时原来j位置的元素已经往前挪了一位,再执行words.pop(j)就会取到超出当前列表长度的索引,必然报错。 - 低效的长度计算:你嵌套循环逐个字母计数来获取单词长度,完全可以直接用Python内置的
len()函数,简洁又高效。 - 错误的循环逻辑:你用
for word in words来计数遍历,但在循环过程中修改了原列表,这会导致迭代器状态混乱,后续循环会跳过元素或者遍历到不存在的位置。 - 缺少停止条件:你的代码没有判断什么时候应该停止,只会按原列表的元素数量遍历一次,不会持续查找直到没有符合条件的对。
修正后的代码实现
下面是修复后的代码,我会逐段解释逻辑:
# 读取文件中的单词列表 with open('input.txt', 'r') as f: words = f.read().split() # 持续查找直到没有符合条件的单词对 while True: found = False # 标记是否找到符合条件的对 # 遍历所有可能的单词对组合(i从0到倒数第二个,j从i+1到最后一个) for i in range(len(words)): for j in range(i + 1, len(words)): if len(words[i]) + len(words[j]) == 20: # 找到符合条件的对,打印 print(words[i], words[j]) # 注意:先pop索引大的j,再popi,避免索引偏移 words.pop(j) words.pop(i) found = True # 找到一对后立即跳出所有循环,重新开始查找(因为列表已经改变) break if found: break # 如果一轮遍历下来没找到任何符合条件的对,退出循环 if not found: break
关键逻辑说明:
with语句读取文件:这是Python推荐的文件操作方式,会自动关闭文件,避免资源泄漏。while True循环:用来持续查找,直到没有符合条件的对为止。found标志位:用来标记当前轮次是否找到符合条件的单词对,如果找到就重新开始查找(因为移除元素后列表结构变化,之前的索引已经无效);如果没找到,就退出整个循环。- 先pop大索引再pop小索引:比如要移除i和j(i<j),如果先pop(i),那么j位置的元素会变成j-1,此时再pop(j)就会出错;所以先pop(j),再pop(i)就能正确移除两个元素。
- 用
len()直接获取单词长度:替代你之前逐个字母计数的低效写法。
这样修改后,程序就能正确找到所有长度和为20的单词对,打印并移除,直到列表中不存在这样的对时自动停止运行。
内容的提问来源于stack exchange,提问作者user14311289
相关产品推荐
相关产品推荐

