在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[i] = 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[k] = 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[k] 赋值,因此 hanshu2 会原地修改传入的第一个字典。合并完成后,dictA 和 dictC 指向同一份统计结果,dictA 也会变成合并后的计数。这种写法适合希望直接复用第一个字典的场景;如果后续还要保留原始 dictA,需要先用复制出来的字典作为第一个参数,再执行合并。
四、适用场景
这种“相同键相加、缺失键从 0 开始”的合并方式,适合把多批文本、列表或日志分别统计后的词频、元素次数汇总到一起。核心是 A.get(k,0) 对缺失键返回 0,避免 KeyError,同时保证相同键的计数累加。这里的关键是计数累加,而不是简单替换。
总结:单个统计可用 dic.get(i,0)+1;合并两个计数字典可用 A.get(k,0)+v 并写回 A[k]。原文从 dictA、dictB 到 dictC 的代码和结果,完整展示了这一处理过程;实际调用时注意 hanshu2 会原地修改第一个字典。 |