python2.4 generator expression > python2.3 list expression

Dan Sommers me at privacy.net
Mon Feb 21 06:48:19 EST 2005


On Sun, 20 Feb 2005 20:56:52 -0800,
snacktime <snacktime at gmail.com> wrote:

> I need to convert a generator expression to a list expression so it
> will work under python 2.3.

> I rewrote this:

> for c in range(128):
>   even_odd = (sum(bool(c & 1<<b) for b in range(8))) & 1

> As this:

> for c in range(128):
>   bo = [bool(c & 1<<b) for b in range(8)]
>   even_odd = sum(bo) & 1


> Seems to work, is there a better way to do this?

for c in range( 128 ):
    even_odd = 0
    print '%3d' % c,
    while c:
        c &= c - 1
        even_odd = not even_odd
    print int( even_odd )

Okay, so your inner loop is only counting to 8, but IMO this is a good
example of how to use a better algorithm instead of optimizing the code
of a naïve one.  My inner loop only iterates over 1-bits.

"Better," of course is all relative.  Your algorithm obviously counts
bits in an integer.  My algorithm is less clear at first glance (and
even second and third glance), but nearly idiomatic to those of us who
spent lots of time writing embedded assembly code.

If you have the space to spare, a lookup table (pre-calculated or
created during your program's initialization) is probably the best way
to go.

Regards,
Dan

-- 
Dan Sommers
<http://www.tombstonezero.net/dan/>
Never play leapfrog with a unicorn.



More information about the Python-list mailing list