python:如何添加collections.defaultdict(int) 到另一个集合?

python: how to add a collections.defaultdict(int) to another?

本问题已经有最佳答案,请猛点这里访问。

我喜欢这样的陈述。

(通过语句[5]和[6]笨拙地获得和非优化地获取)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
In [1]: from collections import defaultdict

In [2]: d1 = defaultdict(int, dict(a=1, b=2, c=3))

In [3]: d2 = defaultdict(int, dict(a=10, c=30, d=40))

In [4]: d1 |= d2
TypeError: unsupported operand type(s) for |=: 'collections.defaultdict' and 'collections.defaultdict'

In [5]: def default_dict_add(d1, key, val):
            d1[key] += val

In [6]: [default_dict_add(d1, k, d2[k]) for k in d2.keys()]
Out[6]:
[None, None, None]

In [7]: d1
defaultdict(int, {'a': 11, 'b': 2, 'c': 33, 'd': 40})

类似于您可以对集合执行的操作(语句[44]

1
2
3
4
5
6
7
8
9
10
11
12
In [42]: s1 = {1, 2, 3}
s1 = {1, 2, 3}

In [43]: s2 = {10, 30, 40}
s2 = {10, 30, 40}

In [44]: s1 |= s2

In [45]: s1

Out[45]:
{1, 2, 3, 10, 30, 40}


您可以使用Counter

1
2
3
4
5
>>> from collections import Counter
>>> c1 = Counter(d1)
>>> c2 = Counter(d2)
>>> c1 + c2
Counter({'d': 40, 'c': 33, 'a': 11, 'b': 2})

或:

1
2
>>> {k: d1.get(k, 0) + d2.get(k, 0) for k in set(list(d1.keys()) + list(d2.keys()))}
{'a': 11, 'c': 33, 'b': 2, 'd': 40}

您所做的似乎更适合Counter,它与defaultdict在同一模块中。

1
2
3
4
d1 = Counter(dict(a=1, b=2, c=3))
d2 = Counter(dict(a=10, c=30, d=40))
d1 + d2
# Counter({'d': 40, 'c': 33, 'a': 11, 'b': 2})