2011-10-07 13 views
0

我想通過週期性地擴展輸入中給出的列表來構建一些列表(a,b,c,d)。Python切片命令被遺忘出循環

週期性的結構是這樣的,每個列表的第一元件必須被重複,而所有其他的元素必須是直到達到最大長度在輸入設定(它是可能的期間,不得到被重複整數次)。

舉個例子,如果我有作爲輸入

a = [1, 2, 3, 4]   max_len=11 

欲獲得作爲輸出

a = [1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2] 

我寫這段代碼:

for mylist in [a, b, c d]: 
    period = mylist[1:]  # all elements but the first are repeated 
    while len(mylist)< max_len: 
     mylist.extend(period) 
    mylist = mylist[:max_len] # cut to max_len       
    print mylist 
print a, b, c, d 

如果我運行這個,我從兩個打印命令中看到,我的列表是我希望它們在程序仍處於循環中時的狀態,但它們會得到b ACK給「非切片」時長圈外,也就是一個回來的長度大於其中週期僅重複4次MAX_LEN:

a = [1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4] 

這是爲什麼?它看起來像程序忘記了切片(但不是擴展名)。

我知道這是一個非常簡單的問題,我可以用其他方式解決它,但我想了解爲什麼這個想法不起作用。 謝謝你的幫助!

回答

6

問題是mylist = mylist[:max_len]創建了一個新的列表,而不是修改mylist到位,所以結果永遠不會傳播回a等。

如果更換:

mylist = mylist[:max_len] 

mylist[:] = mylist[:max_len] 

認爲會解決它。

順便說一句,你可以使用itertools進行了改造:

In [10]: [a[0]] + [v for v in itertools.islice(itertools.cycle(a[1:]), max_len - 1)] 
Out[10]: [1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2] 
2

mylist在循環開始了指輸入列表,如a之一,但是當你分配給它,你只是重新綁定名稱mylist到一個新的列表,你不修改原始列表。

這會工作:

for mylist in [a, b, c, d]: 
    period = mylist[1:]  # all elements but the first are repeated 
    while len(mylist)< max_len: 
     mylist.extend(period) 
    mylist[:] = mylist[:max_len] # cut to max_len       
    print mylist 
print a, b, c, d 

切片分配更新原始列表。

或者你可以試試這個,只需更新原始列表一次:

for mylist in [a, b, c, d]: 
    mylist[1:] = (mylist[1:] * (1+max_len//(len(mylist)-1)))[:max_len] 
    print(mylist) 
print a, b, c, d