以下代码中的最后一行是什么意思?
import pickle, urllib
handle = urllib.urlopen("http://www.pythonchallenge.com/pc/def/banner.p")
data = pickle.load(handle)
handle.close()
for elt in data:
print "".join([e[1] * e[0] for e in elt])
我对这个问题的尝试:
e[1] * e[0] for e in elt
答案 0 :(得分:20)
也许最好用一个例子来解释:
print "".join([e[1] * e[0] for e in elt])
是
的缩写形式x = []
for e in elt:
x.append(e[1] * e[0])
print "".join(x)
列表推导只是for
循环的语法糖,它是一系列语句中的表达式。
elt
可以是一个任意对象,因为你从pickles加载它,e
同样。用法表明它是sequence类型,但它可以是实现序列协议的任何东西。
答案 1 :(得分:7)
首先,您需要将http://放在URL前面,即:
handle = urllib.urlopen("http://www.pythonchallenge.com/pc/def/banner.p")
表达式[e for e in a_list]
是list comprehension,可生成值列表。
使用Python字符串,*
运算符用于重复字符串。尝试将命令逐个输入解释器,然后查看数据:
>>> data[0]
[(' ', 95)]
这表明我们每行数据都是一个包含两个元素的元组。
因此,表达式e[1] * e[0]
实际上是e[0]
重复e[1]
次的字符串。
因此该节目绘制了一面旗帜。
答案 2 :(得分:4)
[e[1] * e[0] for e in elt]
是一个列表推导,它通过循环遍历另一个列表来评估列表本身,在本例中为elt
。新列表中的每个元素都是e[1]*e[0]
,其中e
是elt
中的对应元素。
答案 3 :(得分:2)
问题本身已经得到了充分的回答,但我想补充一点,列表理解也支持过滤。你原来的一行
print "".join([e[1] * e[0] for e in elt])
作为一个例子,可以成为
print "".join([e[1] * e[0] for e in elt if len(e) == 2])
仅对elt中具有两个元素的项目进行操作。
答案 4 :(得分:1)
join()是一个字符串方法,适用于新字符串
中的分隔符>>> ':'.join(['ab', 'cd'])
>>> 'ab:cd'
并且那里没有列表理解,生成器就足够了
答案 5 :(得分:1)
安迪是一个很好的答案!
如果你想看到循环的每一步(使用换行符),请尝试这样做:
for elt in data:
for e in elt:
print "e[0] == %s, e[1] == %d, which gives us: '%s'" % (e[0], e[1], ''.join(e[1] * e[0]))