[英]Problem in understanding Python list comprehensions
最后一行在以下代码中是什么意思?
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
也许最好用一个例子来解释:
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
可以是任意对象,因为您可以从泡菜中加载它, e
也是如此。 用法表明它是一种序列类型,但是它可以是实现序列协议的任何东西。
首先,您需要在URL前面加上http://,即:
handle = urllib.urlopen("http://www.pythonchallenge.com/pc/def/banner.p")
表达式[e for e in a_list]
是一个列表 [e for e in a_list]
,它生成值列表。
对于Python字符串, *
运算符用于重复字符串。 尝试将命令一个接一个地输入解释器,然后查看数据:
>>> data[0]
[(' ', 95)]
这向我们显示了每一行数据都是一个包含两个元素的元组。
因此,表达式e[1] * e[0]
有效是在串e[0]
重复e[1]
次。
因此,程序绘制了一个横幅。
[e[1] * e[0] for e in elt]
是一个列表[e[1] * e[0] for e in elt]
,它通过循环遍历另一个列表(在这种情况下为elt
来评估列表本身。 新列表中的每个元素都是e[1]*e[0]
,其中e
是elt
的对应元素。
这个问题本身已经得到了完整的回答,但是我想补充一点,列表理解还支持过滤。 你原来的台词
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项目进行操作。
join()是一个字符串方法,适用于新字符串中的分隔符
>>> ':'.join(['ab', 'cd'])
>>> 'ab:cd'
并且列表理解没有必要,生成器就足够了
安迪是一个很好的答案!
如果要查看循环的每个步骤(带有换行符),请尝试以下操作:
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]))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.