2012-12-22 54 views
3

我想要下面的一段代碼將2附加到列表'a',直到它獲得10的大小。但是,它不能以我希望的方式工作。我錯過了什麼?Python動態循環終止變量

a = [1,2] 

for ctr in range(0,len(a)): 
    print ctr 
    if len(a) < 10: 
     a.append(2) 
+3

for循環似乎有點短,沒有按是嗎?即使它每次都會被評估,但它不太可讀。 – keyser

+0

我的主要關注點是沒有實現一個for循環做一個愚蠢的工作,但瞭解它是如何工作的,以及它如何區別於python – bfaskiplar

回答

4

你只循環兩次; len(a)只有評估創建range(),而不是每循環迭代。因此,你只能落得長的名單4.

使用while語句來代替:

while len(a) < 10: 
    a.append(2) 

.extend()正確數量的2 S:

a.extend([2] * (10 - len(a))) 

或使用+= (這是.extend()的簡稱):

a += [2] * (10 - len(a)) 

這兩種方法都完全避免了循環。

2

只是做一個while循環,直到它的大小你想要的:

a = [1,2] 
while len(a) < 10: 
    a.append(2) 

的問題是,你是對的a目前的規模基礎的原始循環。評估時,它只會循環2次。另一方面,一個while循環將每次都保持評估該長度。

3

range(len(a))在循環開始時評估一次。在這一點上,你的列表有兩個項目,所以循環將被執行兩次。

做你想做什麼,更好的方法是:

a += [2] * (10 - len(a)) 

你知道你有多少項目來補充,所以加一次全部,而不是一個在一段時間逐一添加循環。

+0

中的while循環嗎? – bfaskiplar

1

只是在另一種方法的完整性扔......(並且可以更加靈活填補了其他iterables等值...)

>>> from itertools import chain, islice, repeat 
>>> list(islice(chain(a, repeat(2)), 10)) 
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2]