9

以下代码中的最后一行是什么意思?

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])

我对这个问题的尝试:

  • "".join... 使用 join 方法来清空文本
  • e[1] * e[0] 将序列中的两个后续值相乘,e
  • 我不确定什么是 e
  • 我不确定,当你在 for -loop 之前有一些东西时,这意味着什么,比如:e[1] * e[0] for e in elt
4

6 回答 6

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可以是任意对象,因为您从泡菜加载它,e同样如此。用法表明它是一种序列类型,但它可能只是实现序列协议的任何东西。

于 2009-02-01T18:34:33.327 回答
7

首先,您需要在 URL 前面加上 http://,即:

handle = urllib.urlopen("http://www.pythonchallenge.com/pc/def/banner.p")

表达式[e for e in a_list]是一个列表推导式,它生成一个值列表。

对于 Python 字符串,*运算符用于重复字符串。尝试将命令一一输入到解释器中,然后查看数据:

>>> data[0]
[(' ', 95)]

这向我们展示了每一行数据是一个包含两个元素的元组。

因此,表达式e[1] * e[0]实际上是e[0]重复e[1]次数的字符串。

因此,该程序绘制了一个横幅。

于 2009-02-01T18:34:12.920 回答
4

[e[1] * e[0] for e in elt]是一个列表推导式,它通过循环另一个列表来评估一个列表本身,在这种情况下是elt. 新列表中的每个元素是e[1]*e[0],其中e是 中的对应元素elt

于 2009-02-01T18:28:03.463 回答
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 中具有两个元素的项目进行操作。

于 2009-02-03T21:06:38.697 回答
1

join() 是一个字符串方法,适用于新字符串中的分隔符

>>> ':'.join(['ab', 'cd'])
>>> 'ab:cd'

并且那里不需要列表理解,生成器就足够了

于 2009-02-01T18:33:19.397 回答
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]))
于 2009-02-01T19:15:46.863 回答