在遍歷list的時候,刪除符合條件的資料,結果不符合預期
num_list = [1, 2, 2, 2, 3](num_list)
for item in
num_list:
if item == 2:
num_list.remove(item)
else
:
(item)
print(num_list)
結果是
[1, 2, 2, 2, 3]1[1, 2, 3]
或者有:
num_list = [1, 2, 3, 4, 5](num_list)
for i in
range(len(num_list)):
if num_list[i] == 2:
num_list.pop(i)
else
:
(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](num_list)
for item in
num_list[:]:
if item == 2:
num_list.remove(item)
else
:
(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...