脚本专家 发表于 2026-9-23 11:00:00

Python统计次数字典合并与相同键值累加实现教程

在Python里做词频或元素计数时,常见做法是先用 dic.get(i,0)+1 生成单个统计字典。当两份数据分别统计完成后,就需要把两个计数字典合并,并让相同键的计数相加,而不是让后一个字典覆盖前一个字典。下面按原文代码拆解统计、合并、调用和注意点。

一、先统计两个列表的元素次数

a = ['a','a','a','c','b','c','d','e','r','w','w','d']
b = ['a','b','a','d','c','r','a','e','r','b','s','w']

def hanshu(A):
    dic = {}
    for i in A:
      dic = dic.get(i,0)+1
    return dic

dictA = hanshu(a)
dictB = hanshu(b)

这里 hanshu 接收可迭代对象 A,内部新建 dic。遍历每个元素 i 时,用 dic.get(i,0) 取当前计数,没有则返回 0,再加 1 写回。这样列表中每个不同元素都会成为字典键,值是对应出现次数。
运行后得到:

dictA = {'a': 3, 'c': 2, 'b': 1, 'd': 2, 'e': 1, 'r': 1, 'w': 2}
dictB = {'a': 3, 'b': 2, 'd': 1, 'c': 1, 'r': 2, 'e': 1, 's': 1, 'w': 1}


二、合并两个统计字典并累加相同键
原文给出的合并函数如下:

def hanshu2(A,B):
    for k,v in B.items():
      A = A.get(k,0)+v
    return A

dictC = hanshu2(dictA,dictB)

hanshu2 的参数 A、B 都是字典。它遍历 B.items(),拿到 B 中的每个键 k 和计数 v;然后执行 A.get(k,0)+v。如果 k 已经在 A 中,就在 A 原计数上加上 B 的 v;如果 k 不在 A 中,A.get(k,0) 返回 0,相当于把 k 以 v 作为初始计数写入 A。最后返回 A。
合并结果为:

dictC = {'a': 6, 'c': 3, 'b': 3, 'd': 3, 'e': 2, 'r': 3, 'w': 3, 's': 1}


三、调用方式与需要注意的地方
调用时写作 dictC = hanshu2(dictA,dictB)。从代码逻辑看,函数内部直接对 A 赋值,因此 hanshu2 会原地修改传入的第一个字典。合并完成后,dictA 和 dictC 指向同一份统计结果,dictA 也会变成合并后的计数。这种写法适合希望直接复用第一个字典的场景;如果后续还要保留原始 dictA,需要先用复制出来的字典作为第一个参数,再执行合并。

四、适用场景
这种“相同键相加、缺失键从 0 开始”的合并方式,适合把多批文本、列表或日志分别统计后的词频、元素次数汇总到一起。核心是 A.get(k,0) 对缺失键返回 0,避免 KeyError,同时保证相同键的计数累加。这里的关键是计数累加,而不是简单替换。

总结:单个统计可用 dic.get(i,0)+1;合并两个计数字典可用 A.get(k,0)+v 并写回 A。原文从 dictA、dictB 到 dictC 的代码和结果,完整展示了这一处理过程;实际调用时注意 hanshu2 会原地修改第一个字典。

热心网友6 发表于 2026-9-23 19:00:00

Re: Python统计次数字典合并与相同键值累加实现教程

感谢分享,整体拆解挺清楚,尤其是强调合并时相同键要累加而不是覆盖,这个点很实用。不过我看代码示例里有两处小问题:`dic = dic.get(i,0)+1` 这里会把 dic 从字典变成整数,下一轮再调用 get 就会报错,应该写成 `dic = dic.get(i,0)+1`;合并那里也是,`A = A.get(k,0)+v` 会把 A 变成整数,正确是 `A = A.get(k,0)+v`。后面给出的结果应该也是按修正后的逻辑跑出来的。另外你最后提醒得很对,hanshu2 会原地改第一个字典,如果还要保留 dictA,可以先 `dictC = dictA.copy()` 再传给函数,或者在函数里先复制一份再合并。这样这个教程就更完整了。

热心网友7 发表于 2026-9-23 19:10:00

Re: Python统计次数字典合并与相同键值累加实现教程

楼主整理得挺系统,尤其把缺失键从 0 开始、相同键累加而不是覆盖这一点讲明白了。不过代码里有两处关键笔误,实际运行会出问题:hanshu 里 `dic = dic.get(i,0)+1` 应改为 `dic = dic.get(i,0)+1`,否则 dic 会被赋成整数,下一次循环就没法继续统计了。hanshu2 里 `A = A.get(k,0)+v` 同理,应写成 `A = A.get(k,0)+v`;只有这样才会原地修改传入的第一个字典。如果想保留原始 dictA,可以调用 `hanshu2(dictA.copy(), dictB)`。修正后,示例里的 dictA、dictB 和 dictC 结果就能和代码逻辑对应上了。整体思路没问题,`get(k,0)` 避免 KeyError 这个点也很实用。

热心网友6 发表于 2026-9-23 19:20:00

Re: Python统计次数字典合并与相同键值累加实现教程

感谢分享,整体拆解很清楚,尤其是最后提醒 hanshu2 会原地修改第一个字典这点很实用。不过我看了一下,代码里有两处关键地方可能写漏了下标,按原文直接运行会出问题:统计时 dic = dic.get(i,0)+1 会把 dic 重新赋成整数,应该写成 dic = dic.get(i,0)+1;合并时 A = A.get(k,0)+v 也一样,应该写成 A = A.get(k,0)+v,否则 A 会变成整数,返回的 dictC 也不会是合并后的字典。改正后,A.get(k,0) 避免 KeyError 和相同键累加的逻辑就成立了。另外原地修改的提醒很对,改正后 hanshu2 确实会改到传入的第一个字典,想保留原 dictA 就先复制一份。适用场景总结得不错,词频、日志统计汇总都能用。
页: [1]
查看完整版本: Python统计次数字典合并与相同键值累加实现教程