for row in c:
for i in range(len(row)):
if i not in keep:
del row[i]
我收到的最後一行此錯誤:蟒蛇:列表分配索引超出範圍
IndexError: list assignment index out of range
我不明白怎麼會這樣,如果它存在的範圍!請幫助
for row in c:
for i in range(len(row)):
if i not in keep:
del row[i]
我收到的最後一行此錯誤:蟒蛇:列表分配索引超出範圍
IndexError: list assignment index out of range
我不明白怎麼會這樣,如果它存在的範圍!請幫助
如果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]
該索引存在於循環的開始處,但是一旦刪除了一個元素,該列表就會變短,並且不包含相同數量的元素。因此,你的指數可能是錯的。如果您從列表末尾刪除,則不會使列表索引無效。
但我對這種模式感到驚訝;也許有更好的方法來解決你在找什麼?也許設置減法或類似的東西會做你想做的事情,而不用修改列表幾十或幾百次。
也許你可以把它寫這樣
for row in c:
row[:] = [x for i,x in enumerate(row) if i in keep]
這並不具有完全相同的效果,因爲列表理解會創建一個新列表,但不會將新列表保存回c。 – 2010-08-03 00:18:02
@邁克爾,沒問題,我通過做一個切片分配來解決它 – 2010-08-03 00:34:21
,而你是迭代,以防止這樣的錯誤,不應更改列表。
我該如何向後迭代? – 2010-08-03 00:02:56
for i in inverted(range(...)): – viraptor 2010-08-03 00:05:31