[Tutor] adding dictionary values

Richard Lovely roadierich at googlemail.com
Fri Mar 20 17:03:56 CET 2009


2009/3/20 Chris Fuller <cfuller084 at thinkingplanet.net>:
> You should iterate over the keys of the dictionary:
> for k in a.keys():
> because if you iterate over the full dictionary, your items are the values,
> not the keys.  Otherwise your code looks correct, and I don't think its
> terribly bad form.  You could do something interesting with sets:
> sa = set(a.keys())
> sb = set(b.keys())
>
> The next step could be a for loop, but if you enjoy terseness and taking
> advantage of language features (also should be faster for big enough dicts):
> c = dict( \
>   [(k, a[k]+b[k]) for k in sa&sb ] + \
>   [(k, a[k]) for k in sa-sb ] + \
>   [(k, b[k]) for k in sb-sa ]
> )
>
> which creates a new dict from a list of key, value pairs.  The list is a sum
> of three lists:  those keys in both a and b, those only in a, and those only
> in b.
>
> Cheers
>
> On Friday 20 March 2009 10:11, Emad Nawfal wrote:
>> Hi Tutors,
>> I have two pickled dictionaries containing word counts from two different
>> corpora. I need to add the values, so that a word count is the sum of both.
>> If the word "man" has a count of 2 in corpus A and a count of 3 in corpus
>> B, then I need a new dictionary that  has "man": 5. Please let me know
>> whether the following is correct/incorrect, good/bad, etc.
>> Your help appreciated:
>>
>> def addDicts(a, b):
>>     c = {}
>>     for k in a:
>>         if k not in b:
>>             c[k] = a[k]
>>         else:
>>             c[k] = a[k] + b[k]
>>
>>     for k in b:
>>         if k not in a:
>>             c[k] = b[k]
>>     return c
>>
>> # test this
>> dict1 = {"dad": 3, "man": 2}
>> dict2 = {"dad": 5, "woman": 10}
>> newDict = addDicts(dict1, dict2)
>> print(newDict)
>> # This gives
>>
>> {'dad': 8, 'woman': 10, 'man': 2}
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
>

Just to add another tool to your toolbox, defaultdicts, available from
version 2.5, are good for word counts, and simplifies your function no
end:

from collections import defaultdict
def addDict(a, b):
    newdict = defaultdict(int, a)
    for k,v in b.iteritems():
        newdict[k] += v
    return newdict

you can chage the last line to "return dict(newdict)" if the returned
value MUST be a dict, but there is very little advantage to doing so
in properly written code.

Extra credit:
To do a word count with a defaultdict is simple:
wordcount = defaultdict(int)
for word in list_of_words:
    wordcount[word] += 1

Look it up in the docs if you want details of defaultdict.
-- 
Richard "Roadie Rich" Lovely, part of the JNP|UK Famile
www.theJNP.com


More information about the Tutor mailing list