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
相关产品推荐
相关产品推荐

