如何用递归defaultdict实现Python嵌套字典统计字符串序列次数
解决递归defaultdict统计序列次数的类型错误
你的问题出在递归定义的defaultdict每一层都是嵌套的defaultdict,而非最后一层需要的int类型:当执行current_dict[words[-1]] += 1时,current_dict[words[-1]]会自动生成一个新的defaultdict(nested_dict)实例,而不是初始值为0的整数,自然无法执行+=操作。
修复方案:手动处理最后一个词的初始化与累加
修改update_ngrams函数,在处理最后一个词时先检查键是否存在,不存在则设为1,存在则累加:
from collections import defaultdict # 保持原递归defaultdict定义 nested_dict = lambda: defaultdict(nested_dict) ngrams = nested_dict() def update_ngrams(ngrams, words): current_dict = ngrams # 遍历到倒数第二个词,进入对应层级 for word in words[:-1]: current_dict = current_dict[word] # 处理最后一个词:手动初始化或累加 last_word = words[-1] if last_word in current_dict: current_dict[last_word] += 1 else: current_dict[last_word] = 1 # 测试示例 update_ngrams(ngrams, ["My", "big", "cat"]) update_ngrams(ngrams, ["My", "big", "dog"]) # 可选:将嵌套defaultdict转为普通字典方便查看 def to_regular_dict(d): return {k: to_regular_dict(v) if isinstance(v, defaultdict) else v for k, v in d.items()} print(to_regular_dict(ngrams)) # 输出:{'My': {'big': {'cat': 1, 'dog': 1}}}
方案逻辑说明
- 前n-1个词依然利用递归defaultdict自动创建嵌套层级,保持代码简洁性
- 最后一个词跳过defaultdict的自动生成逻辑,手动控制值的类型为整数,彻底避免类型冲突
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

