Introduzione:
ci sono le (probabilmente) migliori soluzioni. Ma devi conoscerlo e ricordarlo e a volte devi sperare che la tua versione di Python non sia troppo vecchia o qualunque sia il problema.
Poi ci sono le soluzioni più "confuse". Sono grandi e brevi ma a volte sono difficili da capire, da leggere e da ricordare.
Vi è, tuttavia, un'alternativa che consiste nel cercare di reinventare la ruota. - Perché reinventare la ruota? - Generalmente perché è un ottimo modo per imparare (e talvolta solo perché lo strumento già esistente non fa esattamente quello che vorresti e / o il modo in cui lo desideri) e il modo più semplice se non lo sai o non ricordare lo strumento perfetto per il tuo problema.
Quindi , propongo di reinventare la ruota della Counter
classe dal collections
modulo (almeno in parte):
class MyDict(dict):
def __add__(self, oth):
r = self.copy()
try:
for key, val in oth.items():
if key in r:
r[key] += val # You can custom it here
else:
r[key] = val
except AttributeError: # In case oth isn't a dict
return NotImplemented # The convention when a case isn't handled
return r
a = MyDict({'a':1, 'b':2, 'c':3})
b = MyDict({'b':3, 'c':4, 'd':5})
print(a+b) # Output {'a':1, 'b': 5, 'c': 7, 'd': 5}
Probabilmente ci sarebbero altri modi per implementarlo e ci sono già degli strumenti per farlo, ma è sempre bello visualizzare come le cose sostanzialmente funzionerebbero.
sum(counters)
purtroppo non funziona.