2010-08-02 101 views

回答

7

如果row是一個列表,那麼不要忘記,刪除一個列表元素會將所有後續元素移回一個位置以填補空缺,因此所有較晚進入列表的索引都將被忽略, (每次刪除另一個元素時,每個索引中的錯誤會增加一個)。有幾種方法來避免這個問題 - 給一個,嘗試向後遍歷列表。

要回應如何向後迭代,您可以嘗試使用可傳遞給range的額外參數。前兩個參數給出的範圍內遍歷(下界是包容性的,和上限獨家),第三個參數是步驟:

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

所以,你的情況,似乎你想:

range(len(row) - 1, -1, -1) 

還是更容易閱讀(感謝viraptor):

reversed(range(len(row)) 

或者,你可以嘗試使用列表理解(我假設c是一個列表):

for row_number, row in enumerate(c): 
    c[row_number] = [x for i, x in enumerate(row) if i in keep] 
+0

我該如何向後迭代? – 2010-08-03 00:02:56

+2

for i in inverted(range(...)): – viraptor 2010-08-03 00:05:31

2

該索引存在於循環的開始處,但是一旦刪除了一個元素,該列表就會變短,並且不包含相同數量的元素。因此,你的指數可能是錯的。如果您從列表末尾刪除,則不會使列表索引無效。

但我對這種模式感到驚訝;也許有更好的方法來解決你在找什麼?也許設置減法或類似的東西會做你想做的事情,而不用修改列表幾十或幾百次。

3

也許你可以把它寫這樣

for row in c: 
    row[:] = [x for i,x in enumerate(row) if i in keep] 
+0

這並不具有完全相同的效果,因爲列表理解會創建一個新列表,但不會將新列表保存回c。 – 2010-08-03 00:18:02

+0

@邁克爾,沒問題,我通過做一個切片分配來解決它 – 2010-08-03 00:34:21

3

,而你是迭代,以防止這樣的錯誤,不應更改列表。

相關問題