2014-02-09 87 views
2

我需要使用列表理解來構建列表。這基本上就是它所要做的:使用帶有列表理解的嵌套for循環構建列表

pattern = [] 
for c in range(3): 
    for r in range(3): 
     if r == c: 
      pattern.append(a) 
     else: 
      pattern.append(b) 

但是,這一切在某種程度上需要被濃縮到只有一條線!我以前從未使用過列表理解,因此請解釋您的解決方案。

謝謝!

編輯: 如果我想新的列表包含子列表,那麼是否也可以將它列入列表理解?上面我用3的範圍內,所以在生產列表中的每個子列表將包括3個要素,即

pattern = [['a','b','b'],['b','a','b'],['b','b','a']] 

回答

4

列表理解的一般形式可以理解這樣

[(the task to be done) (how long it has to be done)] 

我們通常使用for循環中的需要多長時間才能完成部分和要完成的任務部分也可以有if條件。 重要的是要注意的是,要完成的任務部分應該返回一個有效的值(即使None是一個有效的值)。因此,您不能在列表理解中使用任何Python語句(return,在Python 2.x print等中)。

現在回答你的第一個問題,

['a' if r == c else 'b' for c in range(3) for r in range(3)] 
# ['a', 'b', 'b', 'b', 'a', 'b', 'b', 'b', 'a'] 

這正是造成如您在顯示for循環的版本列表。

'a' if r == c else 'b' 

這是相同

if r == c: 
    'a' 
else: 
    'b' 

首先,for c in range(3)將被執行,並且將生成的列表[0, 1, 2],然後在每次迭代for r in range(3)將被執行,將產生該列表[0, 1, 2]。在r的每次迭代中,我們將執行上面看到的if條件,並且將使用該if..else的結果作爲正在生成的新列表的元素。

要回答你的第二個問題,你可以很好地使用列表理解。

從上面的例子我們的基本理解是,列表理解是生成一個列表。現在,讓我們嘗試和巢列表理解(我們將使用列表中理解的任務做部分),這樣

[['a' if r == c else 'b' for r in range(3)] for c in range(3)] 
# [['a', 'b', 'b'], ['b', 'a', 'b'], ['b', 'b', 'a']] 

現在,如果你看看我們的嵌套列表理解,第一,for c in range(3)將被執行,然後['a' if r == c else 'b' for r in range(3)]部分將被執行,這將生成嵌套列表的單獨行。這裏需要注意的是,c在嵌套列表理解中可用。

+0

可以說我希望我的列表由子列表組成,我將範圍設置爲3,因此每個子列表中包含3個元素。那也可以加入列表理解嗎? –

+0

@HayleyvanWaas您能否在實際問題中也包括這個問題,並請示例輸入和輸出解釋? – thefourtheye

+0

@HayleyvanWaas請檢查我的更新回答。 – thefourtheye