[Tutor] adding dictionary values

Emad Nawfal (عماد نوفل) emadnawfal at gmail.com
Fri Mar 20 17:10:43 CET 2009


On Fri, Mar 20, 2009 at 12:03 PM, Richard Lovely
<roadierich at googlemail.com>wrote:

> 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
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
>

Thanks All for the help,
if I want to do this with more than two dictionaries, the obvious solution
for me is to use something like the reduce functions with a list of
dictionary names like:
dictList = [dict1, dict2, dict3]
newDict = reduce(addDicts, dictList)

Is this a satisfactory solution?
-- 
لا أعرف مظلوما تواطأ الناس علي هضمه ولا زهدوا في إنصافه كالحقيقة.....محمد
الغزالي
"No victim has ever been more repressed and alienated than the truth"

Emad Soliman Nawfal
Indiana University, Bloomington
--------------------------------------------------------
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20090320/997a9e8e/attachment.htm>


More information about the Tutor mailing list