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} |
您可以使用
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} |
您所做的似乎更适合
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}) |