2009-02-01 37 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]) 

只在英語教學中有兩個元素的項目進行操作。