Problem in understanding Python list comprehensions
Maybe best explained with an example:
print "".join([e[1] * e[0] for e in elt])
is the short form of
x = []
for e in elt:
x.append(e[1] * e[0])
print "".join(x)
List comprehensions are simply syntactic sugar for for
loops, which make an expression out of a sequence of statements.
elt
can be an arbitrary object, since you load it from pickles, and e
likewise. The usage suggests that is it a sequence type, but it could just be anything that implements the sequence protocol.
The question itself has already been fully answered but I'd like to add that a list comprehension also supports filtering. Your original line
print "".join([e[1] * e[0] for e in elt])
could, as an example, become
print "".join([e[1] * e[0] for e in elt if len(e) == 2])
to only operate on items in elt that have two elements.
Firstly, you need to put http:// in front of the URL, ie:
handle = urllib.urlopen("http://www.pythonchallenge.com/pc/def/banner.p")
An expression [e for e in a_list]
is a list comprehension which generates a list of values.
With Python strings, the *
operator is used to repeat a string. Try typing in the commands one by one into an interpreter then look at data:
>>> data[0]
[(' ', 95)]
This shows us each line of data is a tuple containing two elements.
Thus the expression e[1] * e[0]
is effectively the string in e[0]
repeated e[1]
times.
Hence the program draws a banner.
[e[1] * e[0] for e in elt]
is a list comprehension, which evaluates to a list itself by looping through another list, in this case elt
. Each element in the new list is e[1]*e[0]
, where e
is the corresponding element in elt
.