我對理解這個沒有問題:列表理解如何工作的說明?
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]
中的語法,任何人都可以解釋它是如何工作的?
我對理解這個沒有問題:列表理解如何工作的說明?
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]
中的語法,任何人都可以解釋它是如何工作的?
啊,不可理解的 「嵌套」 內涵。循環以與理解相同的順序展開。
[leaf for branch in tree for leaf in branch]
它有助於像這樣想。
for branch in tree:
for leaf in branch:
yield leaf
的PEP202斷言這句法與「最後的指數變化最快的」是「正確的」,特別是沒有的爲什麼的解釋。
b = [x for xs in a for x in xs]
類似於下面的嵌套循環。
b = []
for xs in a:
for x in xs:
b.append(x)
有效:
...for xs in a...]
是遍歷你的主(外)名單並依次返回每個子表。
...for x in xs]
然後遍歷每個這些子列表。
這可以被改寫爲:
b = []
for xs in a:
for x in xs:
b.append(x)
如果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
爲ascii藝術加1,最好地解釋它 – slashdottir
這是一個嵌套理解的例子。將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列表理解的例子和解釋。
聲明:我是該網站的創建者。
B = [X爲一對XS X XS]是一樣的:
b = []
for xs in a:
for x in xs:
b.append(x)
爲了更好地理解剛剛從右到左,增加對循環另一個後爲它創建列表X成爲名單的元素。
列表解析是使用內部循環生成自己的列表。他們是在Python一個非常共同的特點,他們看起來像:在list_of_things事情的事情]
OK,很好,但是我爲什麼要使用它?
當您想要節省一些空間時,列表解析功能非常適用。當您只需要快速處理列表以在該列表上執行一些重複性工作時,它們也非常方便。如果您瞭解函數式編程,它們也非常有用,但這是後續課程的主題(提示提示)。
但是,如果你所能做的只是通過列表工作,那麼列表解析就不是那麼有用。謝天謝地,它們可以和條件一起使用。
@SeanMcSomething,看起來像作者是我。 http://stackoverflow.com/a/20638000/2225682;) – falsetru
@falsetru該itertools版本是更好的... –
是的itertools版本是易於理解的,但嵌套的列表理解融化了我的大腦5分鐘 –