Python遍歷列表刪除多個列表元素

2022-08-17 09:42:11 字數 1910 閱讀 1174

在遍歷list的時候,刪除符合條件的資料,結果不符合預期

num_list = [1, 2, 2, 2, 3]

print

(num_list)

for item in

num_list:

if item == 2:

num_list.remove(item)

else

:

print

(item)

print(num_list)

結果是

[1, 2, 2, 2, 3]

1[1, 2, 3]

或者有:

num_list = [1, 2, 3, 4, 5]

print

(num_list)

for i in

range(len(num_list)):

if num_list[i] == 2:

num_list.pop(i)

else

:

print

(num_list[i])

print(num_list)

結果報錯:

[1, 2, 3, 4, 5]

traceback (most recent call last):14

5file

"tes.py

", line 5, in

if num_list[i] == 2:

indexerror: list index out of range

process finished with exit code 1

原因是,刪除list中的元素後,list的實際長度變小了,但是迴圈次數沒有減少,依然按照原來list的長度進行遍歷,所以會造成索引溢位。

1.把列表拷貝,然後對原列表進行刪除操作就沒問題了

num_list = [1, 2, 2, 2, 3]

print

(num_list)

for item in

num_list[:]:

if item == 2:

num_list.remove(item)

else

:

print

(item)

print(num_list)

結果:

[1, 2, 2, 2, 3]

13[1, 3]

num_list[:]是對原始的num_list的乙個拷貝,是乙個新的list,所以,我們遍歷新的list,而刪除原始的list中的元素,則既不會引起索引溢位,最後又能夠得到想要的最終結果。此方法的缺點可能是,對於過大的list,拷貝後可能很佔記憶體。

2.從後往前遍歷列表,刪除

3.filter函式

例子 list中去空字元(配合lambda表示式):

condition = lambda t: t != "" (判斷符合條件很複雜就不能使用lambda,自己寫方法吧)

filter_list = list(filter(condition, list)

python的list的底層是實現是乙個pyobject*陣列。如果每次增加乙個元素都擴張記憶體的話效率太低,在增加元素的時候所以會有預申請記憶體。同理刪除元素的時候也不是馬上就減小記憶體空間,他會按照一定的策略減小。而這種減小不太好**。

再加上刪除後索引如何調整並沒有明確定義。比如乙個長度為3的list你刪除了第2個那麼第三個下標應該是2還是3,等等可能會引發歧義。如果這個時候記憶體達到了需要減小的條件,迭代器就不太好判斷新的索引究竟是多少。

所以python為了通用性和安全性考慮就禁止在遍歷時刪除元素了。

Python遍歷列表刪除多個列表元素

在遍歷list的時候,刪除符合條件的資料,結果不符合預期 num list 1,2,2,2,3 print num list for item in num list if item 2 num list.remove item else print item print num list 結果是 ...

Python同步遍歷多個列表

python的for迴圈十分靈活,使用for迴圈我們可以很輕鬆地遍歷乙個列表,例如 a list z c 1,5,m for each in a list print each 但是,有時遍歷乙個列表並不能滿足我們的需求,在一些特殊的場合,我們可能會需要遍歷兩個甚至多個列表,例如,有兩個列表,第乙個...

Python同步遍歷多個列表

使用python中的zip 函式 zip 函式用於將可迭代的物件作為引數,將物件中對應的元素打包成乙個個元組,然後返回由這些元組組成的列表。如果各個迭代器的元素個數不一致,則返回列表長度與最短的物件相同,利用 號操作符,可以將元組解壓為列表。title user time elements chro...