2009-02-01 80 views
7

最后一行在以下代码中的含义是什么?理解Python列表解析中的问题

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]相乘两个连续的值我不知道该序列,E
  • 什么是电子
  • 我不知道,这意味着什么,当你面前有东西给-loop,如:e[1] * e[0] for e in elt
+0

几年前,我真的很喜欢python挑战。 – 2009-02-03 22:03:42

回答

19

也许最好用一个例子说明:

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类型,但它可能只是实现序列协议的任何内容。

4

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

+0

e可能是元组或字典 – SilentGhost 2009-02-01 18:35:05

+0

e可能是实现__getitem__的任何东西。 – 2009-02-01 18:52:14

+0

的确如此,我做了一个糟糕的假设。 – 2009-02-01 18:52:36

1

join()方法是一个字符串的方法,即在新的字符串

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

和列表理解是没有必要有一个分离器的工作原理,发电机就足够了

7

首先,你需要把HTTP: //在URL的前面,即: 手柄=了urllib.urlopen( “http://www.pythonchallenge.com/pc/def/banner.p”)

的表达并[e为电子在ALIST]是一个list comprehension产生的值的列表。

对于Python字符串,*运算符用于重复字符串。尝试中的命令逐个输入到一个解释器再看看数据:

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

这表明我们数据的每一行是一个包含两个元素的元组。

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

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

+0

但切换元素:e [0] = 95和e [1] =''。 – 2009-02-01 18:36:41

+0

感谢您的更正 - 我习惯于将字符串乘以一个整数的“明智的”,我读取它的方式是这样,尤其是数据如何存储! – 2009-02-01 18:44:58

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

只在英语教学中有两个元素的项目进行操作。