Quería sumar 2 diccionarios

inv = {'gold coin': 41, 'rope': 1}
inv2 = {'rope': 3, 'torch': 10}

Lo logré con la subclase Counter

inv = Counter({'gold coin': 41, 'rope': 1})
inv2 = Counter({'rope': 3, 'torch':10})
result = dict(inv + inv2)
print(result)

Con salida:

{'gold coin': 41, 'rope': 4, 'torch': 10}

Y ahora tengo curiosidad si es posible sumar esos 2 diccionarios con bucle y otras formas.

¿Alguna idea?

0
leronx 28 oct. 2017 a las 02:11

4 respuestas

La mejor respuesta

Aquí hay una forma más larga de hacerlo con bucles , para que pueda agregar tantos dictados como desee

inv = {'gold coin': 41, 'rope': 1,}
inv2 = {'rope': 3, 'torch': 10}

def sum_dicts(*args):
    new_dict ={}
    for arg in args:
        for key, value in arg.items():
            if key in new_dict:
                new_dict[key] += value
            else: 
                new_dict[key] = value
    return new_dict

print(sum_dicts(inv, inv2))
1
0TTT0 27 oct. 2017 a las 23:38
inv = {'gold coin': 41, 'rope': 1}
inv2 = {'rope': 3, 'torch': 10}
result = {val: inv.get(val, 0) + inv2.get(val, 0) for val in set(inv).union(inv2)}
print(result)

Salida:

{'torch': 10, 'rope': 4, 'gold coin': 41}
2
utengr 27 oct. 2017 a las 23:17

Puedes probar esto:

import itertools
inv = {'gold coin': 41, 'rope': 1}
inv2 = {'rope': 3, 'torch': 10}
final_data = [(a, list(b)) for a, b in itertools.groupby(list(inv.items())+list(inv2.items()), key=lambda x:x[0])]
new_final_data = {a:sum(c for i, c in b) for a, b in final_data}

Salida:

{'gold coin': 41, 'rope': 4, 'torch': 10}
2
Ajax1234 27 oct. 2017 a las 23:15

Puedes usar una comprensión dictada -

print({k: inv.get(k, 0) + inv2.get(k, 0) for k in set(inv) | set(inv2) })

Impresiones - {'gold coin': 41, 'rope': 4, 'torch': 10}

2
0TTT0 27 oct. 2017 a las 23:16