2015-11-14 64 views
0

我試圖總結我的頭圍繞如何被執行該代碼:列表綜合運行序列

def t(xs): 
    return [[xs[i][j] for i in range(len(xs))] for j in range(len(xs[0]))] 

>>> y = t([[1,2,3],[4,5,6]]) 

所以我想輸出將是:

[1,2,3,4,5,6] 

通過設置for i in range(...)作爲外圈,但注意到輸出實際上是:

[[1,4],[2,5],[3,6]] 

我不確定爲什麼,是因爲第一個循環在方括號之間,因此它會作爲內部循環運行?當我嘗試了這個問題並刪除了括號時,我得到了我最初期待的答案,但不知道爲什麼以及如何改變順序。

回答

0
[[xs[i][j] for i in range(len(xs))] for j in range(len(xs[0]))] 

相當於

result = [] 
for j in range(len(xs[0])): 
    result.append([]) 
    for i in range(len(xs)): 
     result[j].append(xs[i][j]) 

print result 

[xs[i][0] for i in range(len(xs))] with j=0將形成內部循環並返回列表,for j in range(len(xs[0]))將形成外部循環並返回列表的列表。

當你這樣做

[xs[i][j] for i in range(len(xs)) for j in range(len(xs[0]))] 

它相當於

result = [] 
for j in range(len(xs[0])): 
    for i in range(len(xs)): 
     result.append(xs[i][j]) 
+0

感謝您的意見,現在擴大代碼。 –

+0

我相信最後一個代碼示例中的for循環會被切換。 '[x for y in z for x in y]'相當於'for y in z:for x in y:result.append(x)' –

+0

呃,循環順序在這裏是無關緊要的,只要它在邏輯上當量。 – gjha

1

y = t([[1,2,3],[4,5,6]])開始:

xs被定義爲[[1,2,3],[4,5,6]]上述呼叫

現在,讓我們分析可能的輸出列表解析中的每個for

for j in range(len(xs[0]))應的0 <= x <= 2使得x的範圍內得到的值是一個整數作爲不等式或[0,1,2]如果我們將它表示爲一個數組。

for i in range(len(xs))應的0 <= x <= 1使得x的範圍內得到的值是一個整數作爲不等式或[0,1],如果我們將其表示爲一個數組。

那麼究竟發生了什麼?

在列表理解中有一個列表理解,因此您將在理解中構建數組。

從第一次迭代中的初始值j開始將產生參考0。用i;它將有兩個值爲j。如果我們將它表示爲列表,那麼i的那些值將是[0,1]

因此,內部理解的第一個列表是[1,4]。 的「整體」數據在j第一次迭代結束時列表理解的表示現在是[[1,4]]

j時是1; i將再次有兩個可能的值。由於xs的基數爲2,因此i的值爲[0,1]

當內部列表理解爲i時返回;你的結果將是[2,5]。整個列表將在第二次迭代結束時看起來像[[1,4],[2,5]]

同樣的過程將遵循迭代3,其然後產生的[[1,4],[2,5],[3,6]]

推理是列表解析,陣列/列表索引和關於Python的range功能的用例的組合的結果。