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

Python字符串单词统计字典缺失键问题求助

问题原因与修复方案

核心问题:遍历列表时修改列表导致迭代中断

你的代码里在for word in l循环中直接修改了被遍历的列表l,这是when、young、and未被统计的根本原因:

Python的for循环依赖列表的迭代器,迭代器在循环启动时就确定了遍历的元素序列。当你用l[:] = (value for value in l if value != str(word))修改列表内容时,列表的长度和元素位置会发生变化,但迭代器不会同步更新遍历进度。

从运行输出能看到:

  • 初始列表有15个元素,每次处理一个单词就删除列表中所有该单词,列表不断缩短
  • 处理到old时,迭代器已经走到原列表的第5个元素位置,处理完old后列表剩余['when', 'young', 'and', 'when'],但迭代器已耗尽原有遍历序列,循环直接结束,剩余元素完全没被遍历到

修复方案

方案1:保留原逻辑,用集合避免重复统计

通过集合记录已处理的单词,无需修改原列表就能避免重复统计:

# 统计字符串中单词并将其存入字典的程序,键=单词,值=出现次数
def word_in_str(S):
    dict_s = {}   # 创建空字典
    s = S.lower() # 将字符串转为小写
    l = s.split() # 将字符串按空格分割为列表
    processed = set()  # 记录已处理单词,防止重复统计

    print(l)     # 包含所有单词的原始列表

    for word in l:
        if word in processed:
            continue
        
        counter = l.count(word) 
        print(word)  # 测试用:输出当前单词
        print(counter)    # 测试用:输出当前单词的出现次数

        dict_s[word] = counter 
        processed.add(word)  # 标记该单词已处理

        print([w for w in l if w not in processed])  # 模拟原逻辑的删除效果(可选)        

    print(dict_s)         # 统计结果字典


if __name__ == '__main__':    
    word_in_str('I am tall when I am young and I am short when I am old')

方案2:使用Python内置collections.Counter(推荐)

Python标准库的Counter类专门用于统计元素出现次数,代码简洁高效:

from collections import Counter

def word_in_str(S):
    s = S.lower()
    l = s.split()
    dict_s = Counter(l)
    print(dict_s)


if __name__ == '__main__':    
    word_in_str('I am tall when I am young and I am short when I am old')

运行后会得到完整统计结果:
Counter({'i': 4, 'am': 4, 'when': 2, 'tall': 1, 'young': 1, 'and': 1, 'short': 1, 'old': 1})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:10:29