listcomprehension, add elements?

John Machin sjmachin at lexicon.net
Mon Jun 23 07:51:34 EDT 2008


On Jun 23, 9:16 pm, Maric Michaud <ma... at aristote.info> wrote:
> Le Monday 23 June 2008 11:39:44 Boris Borcic, vous avez écrit :
>
> > John Machin wrote:
> > > Instead of sum(a + b for a, b in zip(foo, bar))
> > > why not use sum(foo) + sum(bar)
> > > ?
>
> > or even sum(foo+bar) as may apply.
>
> Because some are better than others :
>
> sum(foo+bar) is the worst, it create a superfluous list of len(foo) + len(bar)
> elements.
>
> sum(a + b for a, b in zip(foo, bar)), creates a list of max(len(foo),
> len(bar)) elements, in most cases it is the same as the former.
>
> This could have been corrected using itertools.izip.
>
> So the winner is sum(foo) + sum(bar), which does not create anything not
> needed.
>
> But if the question is "how to build the list and sum up all elements in a
> efficient way for sequences of arbitrary length ", it's important to make it
> in the same iteration, so the most effective/clear, and so "pythonic", way to
> do this is (untested) :
>
> res, sum = [], 0

Please use tot or total, not sum!


> for s in (a + b for a, b
>                         in zip(itertools.izip(xrange(1, 51),

Perhaps you should not have left zip() in there ...

>                                                      xrange(50, 0, -1)))):
>     sum += s
>     res.append(sum)

Do you mean res.append(s) ?

I would have thought that it would have been better to create the list
and then sum it:
res = [a + b for a, b in itertools.izip(foo_iter, bar_iter)]
total = sum(res)

Cheers,
John



More information about the Python-list mailing list