list.remove方法在刪除元素的時候往往會出現漏刪或者索引越界的情況示例如下:
漏刪:lst=[9,25,1csgnmkv2,36]
for i in lst:
if i>10:
lst.remove(i)
print(lst)
>>>[9, 12
那麼為什麼12被漏刪了呢?其實原理很簡單,如圖:
列表從下標為0開始遍歷,遍歷到25時,將25刪除,返回乙個新的列表:
注意,原來的25對應的下標是1,所以系統會從下標為2的地方開始遍歷,但是在新列表中,下標為2的地方變成了36,所以12就被跳過了。
解決方法:
只需要判斷如果列表中刪除元素,就要重新從0開始遍歷列表。
lst=[9,25,12,36]
while true:
for i in lst:
if i>10:
lst.remove(i)
#如果刪除了元素,退出此次遍歷,開始遍歷新列表
break
else:
break
print(lst)
>>>[9]
索引越界:
當我們用下標遍歷列表時,會出現索引越界的情況,如圖:
lst=[9,25,12,36]
for i in range(len(lst)):
# print(i)
if lst[i]>10:
lst.remove(lst[i])
print(lst)
indexerror: list index out of range
原理都是一樣的,這裡 i 的取值為 0 1 2 3 ,當刪除乙個元素之後,新列表的長度減少,索引變為 0 1 2 ,但是 i 還是根據原來列表的索引取值,所以當 i 取到 3 的時候,新列表沒有該元素,索引越界。
解決方法一:
lst=[25,9,12,36]
j=0for i in range(len(lst)):
if lst[j]>10:
# 下面以j取0為例:
# j =0 時對應元素25被刪除,
# continue的做法的意思是判斷新列表的j元素即0元素是否符合條件
lst.remove(lst[j])
continue
# 如果新列表的j = 0 處不符合條件,j+1,然後再判斷下乙個元素。
j+=1
print(lst)
解決方法二(推薦):
如果讓索引倒序遍歷列表就不會出現越界的問題了。
這樣就算新列表的長度減小了,那麼i 的取值是倒著取的,列表缺少乙個元素對 i 的取值無影響。
例如 i 為3 的元素被刪除了,新列表最高索引為2 而此時 i的下乙個取值正好是 2 ,沒有影響。
lst=[9,25,12,36]
for i in range(len(lst)-1,-csgnmkv1,-1):
# i : 3 2 1 0
if lst[i]>10:
lst.remove(lst[i])
print(lst)
Python中remove漏刪和索引越界問題的解決
更多程式設計教程請到 菜鳥教程 高州陽光論壇 人人影視 list.remove方法在刪除元素的時候往往會出現漏刪或者索引越界的情況示例如下 漏刪 lst 9,25,12,36 for i in lst if i 10 lst.remove i print lst 9,12 那麼為什麼12被漏刪了呢?...
python中list的remove 中的坑
摘要 對於python中的remove 函式,官方文件的解釋是 remove first occurrence of value.大意也就是移除列表中等於指定值的第乙個匹配的元素。常見用法 a 1,2,3,4 a.remove 1 然後a就是 2,3,4 對於a 1,1,1,2 其結果也是 1,1,...
foreach動態刪除控制項漏刪 遍歷不全
foreach control a in picturebox1.controls 在使用 動態刪除控制項時,會導致遍歷不全漏刪的情況。關鍵是這段 可能不會報錯,簡直坑爹。錯誤原因在 foreach迴圈中不能修改集合元素的值 當remove乙個控制項後,剩下控制項的索引會發生變化。解決方法 1.使用...