You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找并移除单词列表中总长度为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

关键逻辑说明:

  1. with语句读取文件:这是Python推荐的文件操作方式,会自动关闭文件,避免资源泄漏。
  2. while True循环:用来持续查找,直到没有符合条件的对为止。
  3. found标志位:用来标记当前轮次是否找到符合条件的单词对,如果找到就重新开始查找(因为移除元素后列表结构变化,之前的索引已经无效);如果没找到,就退出整个循环。
  4. 先pop大索引再pop小索引:比如要移除i和j(i<j),如果先pop(i),那么j位置的元素会变成j-1,此时再pop(j)就会出错;所以先pop(j),再pop(i)就能正确移除两个元素。
  5. 用len()直接获取单词长度:替代你之前逐个字母计数的低效写法。

这样修改后,程序就能正确找到所有长度和为20的单词对,打印并移除,直到列表中不存在这样的对时自动停止运行。

内容的提问来源于stack exchange,提问作者user14311289

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:56:48