user6009175
user6009175

Reputation:

Merging values from 2 dictionaries (Python)

(I'm new to Python!) Trying to figure out this homework question: The function will takes a​s input​ two dictionaries, each mapping strings to integers. The function will r​eturn​ a dictionary that maps strings from the two input dictionaries to the sum of the integers in the two input dictionaries.

my idea was this:

def ​add(​dicA,dicB):
    dicA = {}
    dicB = {}
    newdictionary = dicA.update(dicB)

however, that brings back None.

In the professor's example:

print(add({'alice':10, 'Bob':3, 'Carlie':1}, {'alice':5, 'Bob':100, 'Carlie':1}))

the output is:

{'alice':15, 'Bob':103, 'Carlie':2}

My issue really is that I don't understand how to add up the values from each dictionaries. I know that the '+' is not supported with dictionaries. I'm not looking for anyone to do my homework for me, but any suggestions would be very much appreciated!

Upvotes: 2

Views: 139

Answers (7)

Brett Beatty
Brett Beatty

Reputation: 5973

I personally like using a dictionary's get method for this kind of merge:

def add(a, b):
    result = {}
    for dictionary in (a, b):
        for key, value in dictionary.items():
            result[key] = result.get(key, 0) + value
    return result

Upvotes: 0

Natecat
Natecat

Reputation: 2182

You can try this:

def add(dict1, dict2):
  return dict([(key,dict1[key]+dict2[key]) for key in dict1.keys()])

Upvotes: 0

roadrunner66
roadrunner66

Reputation: 7941

The following is not meant to be the most elegant solution, but to get a feeling on how to deal with dicts.

dictA = {'Alice':10, 'Bob':3, 'Carlie':1}
dictB = {'Alice':5, 'Bob':100, 'Carlie':1} 


# how to iterate through a dictionary
for k,v in dictA.iteritems():
        print k,v

# make a new dict to keep tally
newdict={}

for d in [dictA,dictB]:   # go through a list that has your dictionaries
    print d
    for k,v in d.iteritems():  # go through each dictionary item
        if not k in newdict.keys():
            newdict[k]=v
        else:
            newdict[k]+=v

print newdict

Output:

Bob 3
Alice 10
Carlie 1
{'Bob': 3, 'Alice': 10, 'Carlie': 1}
{'Bob': 100, 'Alice': 5, 'Carlie': 1}
{'Bob': 103, 'Alice': 15, 'Carlie': 2}

Upvotes: 1

First of all, a.update(b) updates a in place, and returns None. Secondly, a.update(b) wouldn't help you to sum the keys; it would just produce a dictionary with the resulting dictionary having all the key, value pairs from b:

>>> a = {'alice':10, 'Bob':3, 'Carlie':1}
>>> b = {'alice':5, 'Bob':100, 'Carlie':1}
>>> a.update(b)
>>> a
{'alice': 5, 'Carlie': 1, 'Bob': 100}

It'd be easiest to use collections.Counter to achieve the desired result. As a plus, it does support addition with +:

from collections import Counter

def add(dicA, dicB):
    return dict(Counter(dicA) + Counter(dicB))

This produces the intended result:

>>> print(add({'alice':10, 'Bob':3, 'Carlie':1}, {'alice':5, 'Bob':100, 'Carlie':1}))
{'alice': 15, 'Carlie': 2, 'Bob': 103}

Upvotes: 2

Dunes
Dunes

Reputation: 40703

I suspect your professor wants to achieve this using more simple methods. But you can achieve this very easily using collections.Counter.

from collections import Counter

def add(a, b):
    return dict(Counter(a) + Counter(b))

Your professor probably wants something like this:

def add(a, b):
    new_dict = copy of a
    for each key/value pair in b
        if key in new_dict
            add value to value already present in new_dict
        else
            insert key/value pair into new_dict
    return new_dict

Upvotes: 0

poke
poke

Reputation: 387677

def ​add(​dicA,dicB):

You define a function that takes two arguments, dicA and dicB.

dicA = {}
dicB = {}

Then you assign an empty dictionary to both those variables, overwriting the dictionaries you passed to the function.

newdictionary = dicA.update(dicB)

Then you update dicA with the values from dicB, and assign the result to newdictionary. dict.update always returns None though.

And finally, you don’t return anything from the function, so it does not give you any results.


In order to combine those dictionaries, you actually need to use the values that were passed to it. Since dict.update mutates the dictionary it is called on, this would change one of those passed dictionaries, which we generally do not want to do. So instead, we use an empty dictionary, and then copy the values from both dictionaries into it:

def add (dicA, dicB):
    newDictionary = {}
    newDictionary.update(dicA)
    newDictionary.update(dicB)
    return newDictionary

If you want the values to sum up automatically, then use a Counter instead of a normal dictionary:

from collections import Counter
def add (dicA, dicB):
    newDictionary = Counter()
    newDictionary.update(dicA)
    newDictionary.update(dicB)
    return newDictionary

Upvotes: 0

TigerhawkT3
TigerhawkT3

Reputation: 49318

From the documentation:

update([other])

Update the dictionary with the key/value pairs from other, overwriting existing keys. Return None.

You don't want to replace key/value pairs, you want to add the values for similar keys. Go through each dictionary and add each value to the relevant key:

def ​add(​dicA,dicB):
    result = {}
    for d in dicA, dicB:
        for key in d:
            result[key] = result.get(key, 0) + d[key]
    return result

result.get(key, 0) will retrieve the value of an existing key or produce 0 if key is not yet present.

Upvotes: 3

Related Questions