2016-04-18 85 views
0

以下是我想要做的:for-expression .append()動作,而不是執行生成器的列表理解:使用表達式追加到列表的pythonic方式:循環.append()動作

l = ['some existing elements'] 
l.append([0, 0, 0, n]) for n in range(10) 
# this will give error 

我有點明白,爲什麼我上面的代碼是錯誤的,見下圖:

l = [ [].append([0, 0, 0, n]) for n in range(10) ] 
l 
>>> [None, None, None, None, None, None, None, None, None, None] 
# python is putting the result of expression "[].append([0,0,0,n])" 10 times in 
# a list comprehension, instead of doing appending 10 times 

如果我們有像DoIt_InsteadOfEvalutingIt(l.append([0,0,0,n])) for n in range(10)我想知道?

我是在浪費大家的時間嗎? for-expression僅適用於列表理解或生成器?可能這是我應該去老同學,只是做(也更快大概):

l = ['some existing elements'] 
for n in range(10): 
    l.append([0, 0, 0, n]) 

# or 
# use for expression to create the data, and append the data 
l = ['some existing elements'] 
l.append([[0, 0, 0, n] for n in range(10)]) 
+0

什麼是您預期的輸出? –

+0

...什麼? '[[0,0,n,n]在範圍內(10)]' –

+0

我知道一個簡單的例子沒有區別,但我想循環「,append()」動作而不是構建先列出理解,然後追加列表理解。 – YunliuStorage

回答

2

不能使用發電機/理解(外部發電機/理解for語法,而不使用顯式循環)。但你可以使用一個簡單的列表理解做你想做的。

>>> [[0,0,0,n] for n in range(10)] 
[[0, 0, 0, 0], [0, 0, 0, 1], ..., [0, 0, 0, 9]] 

如果你需要把所有這些在現有列表的末尾,使用extend

existing_stuff = [1, 2, 3] 
existing_stuff.extend([[0,0,0,n] for n in range(10)]) 

如果您需要做更復雜的東西在你的循環,只要使用正常for循環。

for n in range(10): 
    existing_stuff.append([0,0,0,n]) 
    # other stuff 
+0

所以基本上for-expression僅適用於列表理解或生成器權限? – YunliuStorage

+0

@YunliuStorage我的意思是你可以做顯式循環('for n in range(10):foo(n)'),但是一般來說不,你不能在任何行的末尾打一個'for'表達式並期望它被反覆執行。 –

+0

@ Henry Keiter我的確希望「只是在任何行的末尾打一個表情,並期望它被反覆執行」,現在我知道了,謝謝。 – YunliuStorage

1

看來你在你的第二行缺少方括號。如果你喜歡用這種方式來表達,那麼這個想法很有效。另外append將整個列表作爲元素添加到列表中。你所需要的就是extend這反而會從列表理解添加的每個元素到原始列表l

l = [1, 2, 3, 4] 
[l.extend([n, n + 1]) for n in range(5, 11, 2)] 

print l 

輸出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
+0

不正是我在找什麼,我正在尋找.append()。但是我意識到你的方式是一個有趣的快速入侵,因爲儘管l.extend()返回None,但.extend()動作並不適用於l。 – YunliuStorage

+0

是的,「擴展」或「追加」返回「無」,任何你稱他們的方式,這只是他們的簽名。如果你只是想更新清單,但他們完成工作。你如何編寫它取決於你的編碼風格。 – fips

1

在結束你的建議:

l = ['some existing elements'] 
l.append([[0, 0, 0, n] for n in range(10)]) 

我認爲這是一個好主意,雖然你可能想用extend替換append(我猜是g你想要l的長度增加10,而不是1)。

你可以把它縮短了,像這樣:

l = ['some existing elements'] + [[0, 0, 0, n] for n in range(10)]