building a dict

rurpy at yahoo.com rurpy at yahoo.com
Sat Mar 13 17:26:59 CET 2010


On Mar 13, 9:13 am, ru... at yahoo.com wrote:
> On Mar 13, 8:28 am, Patrick Maupin <pmau... at gmail.com> wrote:
>
>
>
> > On Mar 13, 9:05 am, vsoler <vicente.so... at gmail.com> wrote:
>
> > > Say that "m" is a tuple of 2-tuples
>
> > > m=(('as',3), ('ab',5), (None, 1), ('as',None), ('as',6))
>
> > > and I need to build a "d" dict where each key has an associated list
> > > whose first element is the count, and the second is the sum. If a 2-
> > > tuple contains a None value, it should be discarded.
>
> > > The expected result is:
> > > d={'as':[2, 9], 'ab': [1,5]}
>
> > > How should I proceed? So far I have been unsuccessful. I have tried
> > > with a "for" loop.
>
> > Post your first try at a for loop, and people might be willing to
> > point out problems, but this is such a basic for loop that it is
> > unlikely that anybody is going to write your ENTIRE homework for you.
>
> This is probably what you (OP) were trying to come up with?
> [untested]
>
> d = {}
> for item in m:
>     key = m[0];  value = m[1]
>     if key is None or value is None: continue
>     if key not in dict:
>         d[key] = [value]
>     else:
>         d[key].append (value)
>
> You can replace the
>   for item in m:
>       key = m[0];  value = m[1]
> above with
>   for key, value in m:
> which is a little nicer.
>
> However, as other responses point out, when you want
> to "accumulate" results in a dict, collections.defaultdict
> should pop into your mind first.

Oops, didn't read very carefully, did I?

That should be:
d = {}
for item in m:
    key = m[0];  value = m[1]
    if key is None or value is None: continue
    if key not in dict:
        d[key] = [1, value]
    else:
        d[key][0] += 1
        d[key][1] += value




More information about the Python-list mailing list