user11791503
user11791503

Reputation:

Python program to combine two dictionary adding values for common keys

I have two dictionaries and I need to combine them. I need to sum the values of similar keys and the different keys leave them without sum.

These are the two dictionaries:

d1 = {'a': 100, 'b': 200, 'c':300}
d2 = {'a': 300, 'b': 200, 'd':400}

The expected results:

d3= {'b': 400, 'd': 400, 'a': 400, 'c': 300}

I have successfully made the sum and added them to this third dictionary, but I couldn't know, how to add the different values.

My try

d1 = {'a': 100, 'b': 200, 'c':300}
d2 = {'a': 300, 'b': 200, 'd':400}
d3 = {}

for i, j in d1.items():
    for x, y in d2.items():
        if i == x:
            d3[i]=(j+y)


print(d3)


My results = {'a': 400, 'b': 400}

Upvotes: 2

Views: 2302

Answers (3)

h4z3
h4z3

Reputation: 5458

I like Andrej's answer (I LOVE list/dict comprehensions), but here's yet another thing:

d1 = {'a': 100, 'b': 200, 'c':300}
d2 = {'a': 300, 'b': 200, 'd':400}

d3 = dict(d1) # don't do `d3=d1`, you need to make a copy
d3.update(d2) 

for i, j in d1.items():
    for x, y in d2.items():
        if i == x:
            d3[i]=(j+y)


print(d3)

I realised your own code can be "fixed" by first copying values from d1 and d2.

d3.update(d2) adds d2's contents to d3, but it overwrites values for common keys. (Making d3's contents {'a':300, 'b':200, 'c':300, 'd':400})

However, by using your loop after that, we correct those common values by assigning them the sum. :)

Upvotes: 0

Andrej Kesely
Andrej Kesely

Reputation: 195428

Version without collections.Counter:

d1 = {'a': 100, 'b': 200, 'c':300}
d2 = {'a': 300, 'b': 200, 'd':400}

d = {k: d1.get(k, 0) + d2.get(k, 0) for k in d1.keys() | d2.keys()}
print(d)

Prints:

{'b': 400, 'c': 300, 'd': 400, 'a': 400}

EDIT: With for-loop:

d1 = {'a': 100, 'b': 200, 'c':300}
d2 = {'a': 300, 'b': 200, 'd':400}

d = {}
for k in d1.keys() | d2.keys():
    d[k] = d1.get(k, 0) + d2.get(k, 0)

print(d)

Upvotes: 3

hiro protagonist
hiro protagonist

Reputation: 46849

collections.Counter does what you need:

from collections import Counter

d1 = {"a": 100, "b": 200, "c": 300}
d2 = {"a": 300, "b": 200, "d": 400}

d3 = Counter(d1) + Counter(d2)
# Counter({'a': 400, 'b': 400, 'd': 400, 'c': 300})

Upvotes: 1

Related Questions