2013-12-17 31 views
33

我對理解這個沒有問題:列表理解如何工作的說明?

a = [1,2,3,4] 
b = [x for x in a] 

我認爲這是所有的,但後來我發現這個片段:

a = [[1,2],[3,4],[5,6]] 
b = [x for xs in a for x in xs] 

這使得b = [1,2,3,4,5,6]。問題是我有麻煩理解[x for xs in a for x in xs]中的語法,任何人都可以解釋它是如何工作的?

+6

@SeanMcSomething,看起來像作者是我。 http://stackoverflow.com/a/20638000/2225682;) – falsetru

+1

@falsetru該itertools版本是更好的... –

+1

是的itertools版本是易於理解的,但嵌套的列表理解融化了我的大腦5分鐘 –

回答

44

啊,不可理解的 「嵌套」 內涵。循環以與理解相同的順序展開。

[leaf for branch in tree for leaf in branch] 

它有助於像這樣想。

for branch in tree: 
    for leaf in branch: 
     yield leaf 

PEP202斷言這句法與「最後的指數變化最快的」是「正確的」,特別是沒有的爲什麼的解釋。

+13

它是值得的,你不覺得'[在樹枝中樹枝分枝]'更易於閱讀嗎?希望這可以用另一種方式工作。 –

+7

我不認爲它們中的任何一個都是非常易讀的:^) – wim

+2

也許它需要知道'branch'在'leaf'之前存在嗎?從左向右閱讀理解。 – Ray

3

可以這樣寫

result = [] 
for xs in a: 
    for x in xs: 
     result.append(x) 

你可以閱讀更多關於它here

7

b = [x for xs in a for x in xs]類似於下面的嵌套循環。

b = [] 
for xs in a: 
    for x in xs: 
     b.append(x) 
3

有效:

...for xs in a...] 

是遍歷你的主(外)名單並依次返回每個子表。

...for x in xs] 

然後遍歷每個這些子列表。

這可以被改寫爲:

b = [] 
for xs in a: 
    for x in xs: 
     b.append(x) 
17

如果a = [[1,2],[3,4],[5,6]],那麼如果我們展開該列表比較,我們得到:

 +----------------a------------------+ 
     | +--xs---+ , +--xs---+ , +--xs---+ | for xs in a 
     | | x , x | | x , x | | x , x | | for x in xs 
a = [ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ] 
b = [ x for xs in a for x in xs ] == [1,2,3,4,5,6] #a list of just the "x"s 
+3

爲ascii藝術加1,最好地解釋它 – slashdottir

2

這是一個嵌套理解的例子。將a = [[1,2],[3,4],[5,6]]看作3乘2矩陣(矩陣= [[1,2],[3,4],[5,6]])。

 ______ 
row 1 |1 | 2 | 
     ______ 
row 2 |3 | 4 | 
     ______ 
row 3 |5 | 6 | 
     ______ 

你所看到的列表理解是另一種從列表中獲取所有元素的方法。

我會試着用不同的變量來解釋這個問題,希望這些變量會更有意義。

b = [element for row in matrix for element in row] 

第一個for循環遍歷矩陣內的行,如[1,2],[3,4],[5,6]。第二個for循環遍歷2個元素列表中的每個元素。

我已經在我的網站http://programmathics.com/programming/python/python-list-comprehension-tutorial/上寫了一篇關於List Comprehension的小文章,其中涵蓋了與此問題非常相似的場景。我還給出了一些Python列表理解的例子和解釋。

聲明:我是該網站的創建者。

0

B = [X爲一對XS X XS]是一樣的:

b = [] 
for xs in a: 
    for x in xs: 
     b.append(x) 

爲了更好地理解剛剛從右到左,增加對循環另一個後爲它創建列表X成爲名單的元素。

0

列表解析是使用內部循環生成自己的列表。他們是在Python一個非常共同的特點,他們看起來像:在list_of_things事情的事情]

OK,很好,但是我爲什麼要使用它?

當您想要節省一些空間時,列表解析功能非常適用。當您只需要快速處理列表以在該列表上執行一些重複性工作時,它們也非常方便。如果您瞭解函數式編程,它們也非常有用,但這是後續課程的主題(提示提示)。

但是,如果你所能做的只是通過列表工作,那麼列表解析就不是那麼有用。謝天謝地,它們可以和條件一起使用。