pythonize this!

Peter Otten __peter__ at web.de
Tue Jun 15 09:44:15 EDT 2010


Stefan Behnel wrote:

> superpollo, 15.06.2010 14:55:
>> Peter Otten ha scritto:
>>> superpollo wrote:
>>>
>>>> goal (from e.c.m.): evaluate
>>>> 1^2+2^2+3^2-4^2-5^2+6^2+7^2+8^2-9^2-10^2+...-2010^2, where each three
>>>> consecutive + must be followed by two - (^ meaning ** in this context)
>>>
>>>>>> from itertools import cycle, izip
>>>>>> sum(sign*i*i for sign, i in izip(cycle([1]*3+[-1]*2), range(1,
>>>>>> 2011)))
>>> 536926141
>>
>> don't understand it bit i like this a lot!
> 
> Didn't you want to get it "pythonized"? If it's not understandable, it
> can't be pythonic.

I'm glad I didn't have to say that mayself ;)

OP: You can work it out step by step:

First build a list of signs:

>>> [1]*3+[-1]*2
[1, 1, 1, -1, -1]

Then repeat them infinitely:

>>> c = cycle("xy")
>>> c.next()
'x'
>>> c.next()
'y'
>>> c.next()
'x'
>>> c.next()
'y'
>>> c.next()
'x'

Combine with the bases using izip:

>>> signs = cycle([1]*3+[-1]*2)
>>> [sign*i for sign, i in izip(signs, range(10))]
[0, 1, 2, -3, -4, 5, 6, 7, -8, -9]

Finally calculate the sum:
>>> signs = cycle([1]*3+[-1]*2)
>>> sum(sign*i for sign, i in izip(signs, range(10)))
-3

Peter




More information about the Python-list mailing list