如何从单词列表查找并移除总字母数为20的单词对及代码修复
我来帮你修复代码并实现需求。先梳理下原代码里的核心问题,再一步步改进:
原代码的主要问题
- 手动计算单词长度完全没必要,Python里用
len(word)就能直接得到单词的字母数,既简洁又高效。 - 在遍历列表的同时直接修改列表(用
pop)会导致索引混乱,很容易触发越界错误——因为列表长度在动态变化,原来的索引会失效。 - 循环逻辑绕得太复杂,外层的
for word in words加c计数的设计完全冗余,反而把逻辑搞乱了。 pop的顺序错误:如果先pop(i),原j位置的元素会往前移一位,再pop(j)就会删掉错误的元素。
修复后的代码
# 用with语句自动管理文件,避免忘记关闭文件 with open('input.txt', 'r') as f: words = f.read().split() # 持续循环,直到没有符合条件的单词对为止 while True: found_pair = False # 遍历所有不重复的单词对(i < j,避免重复检查同一对) for i in range(len(words)): for j in range(i + 1, len(words)): # 直接用len()计算单词长度,判断和是否为20 if len(words[i]) + len(words[j]) == 20: print(f"{words[i]} {words[j]}") # 先删除索引大的元素,避免删除小索引后大索引偏移 words.pop(j) words.pop(i) found_pair = True # 找到一对后立刻跳出循环,重新检查新的列表 break if found_pair: break # 如果遍历完所有组合都没找到匹配,就退出程序 if not found_pair: break
代码说明
- 文件读取:用
with语句打开文件,代码块结束后会自动关闭文件,比直接open更安全。 - 循环逻辑:用
while True做无限循环,直到找不到符合条件的对才跳出。 - 匹配检查:通过嵌套循环遍历所有
i < j的单词对,确保每一对只被检查一次,避免重复工作。 - 删除元素:先删索引大的
j,再删小的i——因为j > i,删除j不会影响i的位置,避免索引偏移错误。 - 终止条件:每次循环用
found_pair标记是否找到匹配,若一轮遍历后没找到,就说明没有符合条件的对了,直接退出程序。
内容的提问来源于stack exchange,提问作者user14311289
相关产品推荐
相关产品推荐

