convert loop to list comprehension
Simon Forman
rogue_pedro at yahoo.com
Sat Sep 9 09:17:04 CEST 2006
bvdp at xplornet.com wrote:
<snip>
> Thanks for that, Carl. I think that using the loop is probably what
> I'll end up doing. I had no idea that the listcomp thing would be quite
> a complicated as it is appearing. I had it in my mind that I was
> missing some obvious thing which would create a simple solution :)
>
> Mind you, there are some interesting bits and pieces of code in this
> thread!
List (and generator) comprehensions are not as bad as all that,
although it took me a little while to figure them out too. ;-)
They are basically normal for loops with optional if statements:
res = [expression1 for var in some_iter if expression2]
is just like:
res = []
for var in some_iter:
if expression2:
res.append(expression1)
More complex comprehensions can be broken down the same way (like Rob
Williscroft did for his fourth attempt):
res = [i for i, x in enumerate(seq) for _ in xrange(x)]
becomes:
res = []
for i, x in enumerate(seq):
for _ in xrange(x):
res.append(i)
Doing this can help you puzzle out variables and if statements in
complex list comps, as the following, admittedly contrived, examples
indicate:
R = range(10)
res = []
for n in R:
if n % 2:
for m in range(n):
res.append(m)
print res == [m for n in R if n % 2 for m in range(n)]
res2 = []
for n in R:
for m in range(n):
if n % 2:
res2.append(m)
print res2 == [m for n in R for m in range(n) if n % 2]
res3 = []
for n in R:
for m in range(n):
if m % 2:
res3.append(m)
print res3 == [m for n in R for m in range(n) if m % 2]
# The above prints True three times.
Of course, if your loops get much more complicated than this you should
probably "spell them out" anyway.
HTH,
~Simon
More information about the Python-list
mailing list