理解Python列表推导的问题

时间:2009-02-01 18:22:26

标签: python list-comprehension

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

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 -method来清空文本
  • e [1] * e [0]乘以序列中的两个后续值e
  • 我不确定是什么意思
  • 我不确定,这意味着什么,当你在-loop之前有什么东西时,例如:e[1] * e[0] for e in elt

6 个答案:

答案 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],其中eelt中的对应元素。

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