[Tutor] Amazed
Kent Johnson
kent37 at tds.net
Sat Nov 13 18:26:53 CET 2004
I share your feelings about list comprehensions - I like the
conciseness, and they seem to fit better with how I think, but using one
purely for the side effects seems like abuse.
Here are a couple of different ways to do what you have below, assuming
that myset is a sets.Set (or set builtin from Python 2.4):
myset.update( [ x for x in thingToIterate if x ] )
Set.update() takes any iterable as an argument, not just another set.
In Python 2.4 you can use a generator expression to avoid creating the
intermediate list at all. A generator expression is like a list
comprehension but its value is an iterator instead of a list:
myset.update(x for x in thingToIterate if x)
Sweet!
You can do something similar in Python 2.3 using itertools.ifilter:
import itertools
myset.update(itertools.ifilter(None, thingToIterate))
Cheers
Kent
Bill Mill wrote:
> Jacob,
>
> I think it's a readability problem - it's too easy to abuse list
> comprehensions to turn a 2 or 3 line for loop into a difficult to
> understand one-liner. Today I found myself doing:
>
> [myset.add(x) for x in thingToIterate where x]
>
> instead of:
>
> for x in thingToIterate:
> if x:
> myset.add(x)
>
> which is much more readable, and doesn't eat the memory of creating an
> unnecessary list full of 'None'. I immediately fixed my mistake, but
> it made me realize how addictive list comprehensions are; they're like
> Python crack.
>
More information about the Tutor
mailing list