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

如何用递归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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:57:13