python - 如何合并多个defaultdict(Counter)?

标签 python merge counter addition defaultdict

如何合并多个defaultdict(Counter)

鉴于我有两个 defaultdict(Counter),我尝试了以下方法,它有效但还有其他方法可以实现组合吗?

>>> from collections import Counter, defaultdict
>>> x = {'a':Counter(['abc','def','abc']), 'b':Counter(['ghi', 'jkl'])}
>>> y = {'a':Counter(['abc','def','mno']), 'c':Counter(['lmn', 'jkl'])}
>>> z = x+y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
>>> z = defaultdict(Counter)
>>> for i in x:
...     z[i].update(x[i])
... 
>>> for i in y:
...     z[i].update(y[i])
... 
>>> z
defaultdict(<class 'collections.Counter'>, {'a': Counter({'abc': 3, 'def': 2, 'mno': 1}), 'c': Counter({'jkl': 1, 'lmn': 1}), 'b': Counter({'jkl': 1, 'ghi': 1})})

最佳答案

这看起来还不错,如果有点代码高手的话:

{k:(x.get(k,Counter()) + y.get(k,Counter())) for k in (x.keys()+y.keys())}
Out[23]: 
{'a': Counter({'abc': 3, 'def': 2, 'mno': 1}),
 'b': Counter({'jkl': 1, 'ghi': 1}),
 'c': Counter({'jkl': 1, 'lmn': 1})}

如果你想坚持使用 defaultdict 输出,你可以使用 itertools.chain 将事情简化为一个循环:

z = defaultdict(Counter)

for k,v in chain(x.iteritems(), y.iteritems()):
    z[k].update(v)

关于python - 如何合并多个defaultdict(Counter)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22367723/

相关文章:

python - 如何对 4 列进行分组并根据另一列进行排名?

Python:在纯文本文件上写一个很长的连续数字列表

python - 如何根据部分字符串匹配来过滤字典?

git - 如何在不更改 master 中的配置文件的情况下 merge 到 Git 中?

module - 在一个 WiX 安装程序中包含 32 位和 64 位合并模块

wiki - wiki 使用什么方法来合并并发编辑?

java - 计数器中定义的值增加

python - Linux 中的桌面图标

javascript - 达到 maxlength 值后聚焦下一个输入

counter - 如何实现一个可靠的网页计数器?