I personally would probably do: from collections import defaultdict
label2sum = defaultdict(lambda: 0) for r in rec: for key, value in r.iteritems(): label2sum[key] += value ratio = label2sum["F1"] / label2sum["F2"] This iterates through each 'r' only once, and (imho) is pretty readable provided you know how defaultdicts work. Not everything has to unnecessarily be made a one-liner. Coding is about readability first, optimization second. And optimized code should not be abbreviated, which would make it even harder to understand. I probably would have gone with your second solution if performance was no object. Cheers, Chris -- Follow the path of the Iguana... http://rebertia.com On Wed, Oct 8, 2008 at 1:23 PM, beginner <[EMAIL PROTECTED]> wrote: > Hi All, > > I have a list of records like below: > > rec=[{"F1":1, "F2":2}, {"F1":3, "F2":4} ] > > Now I want to write code to find out the ratio of the sums of the two > fields. > > One thing I can do is: > > sum(r["F1"] for r in rec)/sum(r["F2"] for r in rec) > > But this is slow because I have to iterate through the list twice. > Also, in the case where rec is an iterator, it does not work. > > I can also do this: > > sum1, sum2= reduce(lambda x, y: (x[0]+y[0], x[1]+y[1]), ((r["F1"], > r["F2"]) for r in rec)) > sum1/sum2 > > This loops through the list only once, and is probably more efficient, > but it is less readable. > > I can of course use an old-fashioned loop. This is more readable, but > also more verbose. > > What is the best way, I wonder? > > > -a new python programmer > -- > http://mail.python.org/mailman/listinfo/python-list > -- http://mail.python.org/mailman/listinfo/python-list