2013-07-15 42 views
0

我剛剛面對一個令我困惑的問題。我的意思是生成一個列表,由於某種原因我不喜歡的東西:這個特殊的python列表如何生成?

mylist = [i for i in range(5), j for j in range(5)] 

然後翻譯向我抱怨,說是在位置「J」無效的語法之前對「爲」。所以我在列表之前定義了j。有誰能解釋我爲什麼不需要定義'我'而是'j'嗎?

我希望得到的東西,如:

[[0,1,2,3,4],[0,1,2,3,4]] 

但是,我得到了(我給你2到j提前)

[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], 2, 2, 2, 2, 2] 

我真的在這裏感到困惑,任何人都可以告訴我爲什麼我有這個結果呢?

非常感謝。

回答

6

你所要做的是創建兩個嵌套表,所以燕窩的內涵:

[[i for i in range(5)], [j for j in range(5)]] 

,或者因爲你沒有做任何與表達,只是:

[list(range(5)), list(range(5))] 

在Python 2中,即使是list()調用也是多餘的。

你沒有分享你的'定義j以外的列表理解代碼'看起來像,但是要意識到列表理解支持嵌套for循環

列表理解可以看成是一系列的循環和if陳述,從左向右讀被視爲嵌套語句:

[i for i in range(5) for j in range(5)] 

應該讀作:

for i in range(5): 
    for j in range(5): 
     outputlist.append(i) 

從輸出判斷你不喜歡的東西這個代替:

[j for i in range(5)] 

哪裏j設置爲range(5) Python的2

1

你想創建一個列表,以便裏面兩個列表:

list_ = [list(range(5)), list(range(5))] 
print(list_) # [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]] 

這不是覆蓋「名單」的buildin一個好主意,所以最好是爲list名稱添加下劃線或使用其他名稱。

+0

下劃線不看不管怎麼樣,'l'或者'li'怎麼樣? –

+0

我的不好。清單只是我想用來明確問題的一個名稱。我編輯了我的問題以消除誤解。 – Lamian

0

要創建你想你可以做什麼:

>>> [range(5)]*2 
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]] 

,或者,如果你需要的名單是由@Blckknght指出,不同的對象:

>>> [range(5), range(5)] 
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]] 
+0

如果您打算稍後修改內容,這可能會很危險。這是因爲這有兩個引用同一個內部列表,如果你改變了一個(比如說,通過執行'li [0] [0] = 10',你會在多個地方看到結果。如果你不打算儘管寫入列表,這可以工作得很好。 – Blckknght