[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