python循環刪除列表元素常見錯誤與正確方法


python循環刪除列表元素

覺得有用的話,歡迎一起討論相互學習~

我的微博我的github我的B站

常見錯誤

常見錯誤一:使用固定長度循環刪除列表元素

# 使用固定長度循環pop方法刪除列表元素
num_list_1 = [1, 2, 2, 2, 3]

for i in range(len(num_list_1)):
    if num_list_1[i] == 2:
        num_list_1.pop(i)
    else:
        print(num_list_1[i])

print("num_list_1:", num_list_1)
# IndexError: list index out of range
  • 原因是在刪除list中的元素后,list的實際長度變小了,但是循環次數沒有減少,依然按照原來list的長度進行遍歷,所以會造成索引溢出

常見錯誤二:正序循環遍歷刪除列表元素

  • 不能刪除連續的情況
# 正序循環遍歷刪除列表元素
num_list_2 = [1, 2, 2, 2, 3]

for item in num_list_2:
    if item == 2:
        num_list_2.remove(item)
    else:
        print("item", item)
    print("num_list_2", num_list_2)

print("after remove op", num_list_2)

# item 1
# num_list [1, 2, 2, 2, 3]
# num_list [1, 2, 2, 3]
# num_list [1, 2, 3]
# after remove op [1, 2, 3]

  • 思考了下,知道了原因,當符合條件,刪除元素[2]之后,后面的元素全部往前移,但是索引並不會隨着值向前移動而變化,而是接着上一個位置向后移動。這樣就會漏掉解

正確的方法

正確的方法一:倒序循環遍歷

# 倒序循環遍歷刪除列表元素
num_list_3 = [1, 2, 2, 2, 3]

for item in num_list_3[::-1]:
    if item == 2:
        num_list_3.remove(item)
    else:
        print("item", item)
    print("num_list_3", num_list_3)

print("after remove op", num_list_3)

# item 3
# num_list_3 [1, 2, 2, 2, 3]
# num_list_3 [1, 2, 2, 3]
# num_list_3 [1, 2, 3]
# num_list_3 [1, 3]
# item 1
# num_list_3 [1, 3]
# after remove op [1, 3]

正確的方法二:遍歷拷貝的list,操作原始的list

  • 原始的list是num_list,那么其實,num_list[:]是對原始的num_list的一個拷貝,是一個新的list,所以,我們遍歷新的list,而刪除原始的list中的元素,則既不會引起索引溢出,最后又能夠得到想要的最終結果。此方法的缺點可能是,對於過大的list,拷貝后可能很占內存。那么對於這種情況,可以用倒序遍歷的方法來實現。
# 遍歷拷貝的list,操作原始的list
num_list_4 = [1, 2, 2, 2, 3]

for item in num_list_4[:]:
    if item == 2:
        num_list_4.remove(item)
    else:
        print("item", item)

    print("num_list_4", num_list_4)

print("after remove op", num_list_4)

# item 1
# num_list_4 [1, 2, 2, 2, 3]
# num_list_4 [1, 2, 2, 3]
# num_list_4 [1, 2, 3]
# num_list_4 [1, 3]
# item 3
# num_list_4 [1, 3]
# after remove op [1, 3]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM