2017-04-04 5 views
0

So etwas Aussage [4] ist das, was ich mag ...python: wie man ein collections.defaultdict (int) zu einem anderen hinzufügt?

(erhalten, plump & nicht optimal, über Aussagen [5] und [6])

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}) 

ähnlich wie Sie können mit Sätzen (Anweisung # tun [44]

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} 

Antwort

0

Es scheint so, was Sie tun, wäre besser geeignet für eine Counter, die als defaultdict im selben Modul ist.

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}) 
+1

Sie können auch 'verwenden d1 + = d2', wenn Sie' d1' wie in Ihrem Beispiel ändern möchten. –

+0

genial - danke. –

0

können Sie Counter verwenden:

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

Oder:

>>> {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} 
Verwandte Themen