2017-02-06 151 views
0

我寫代碼,從列表中Python的故障與循環

INT分離當我寫這樣沒有工作

list_a = [1,2,3,4,5,6,7,8,'Ahmed','Mustafa',100,103,107] 
list_b = [] 

x = 0 
for item in list_a: 
    if isinstance(item, int): 
     list_b.append(item) 
     list_a.pop(x) 
    x +=1 


print (list_a) 
print (list_b) 
print (x) 

和that`s我輸出的代碼

[2, 4, 6, 8, 'Ahmed', 'Mustafa', 103] 
[1, 3, 5, 7, 100, 107] 
8 

並且代碼以這種方式工作

list_a = [1,2,3,4,5,6,7,8,'Ahmed','Mustafa',100,103,107] 
list_b = [] 
list_d = [] 

x = 0 
for item in list_a: 
    if isinstance(item, int): 
     list_b.append(item) 
    else : 
     list_d.append(item) 
    x +=1 


print (list_a) 
print (list_b) 
print (list_d) 
print (x) 

爲什麼那個小故障發生了?

+0

第二種情況下的輸出是什麼? – Reaper

+1

您正在遍歷列表。修改循環內的列表會干擾迭代。有沒有人提到這個問題的重複之一?今天我找不到合適的搜索鍵。 :-( – Prune

+1

)迭代時,您不能「彈出」一個項目,它會更改迭代器的大小。如果您想刪除項目,則必須從副本中刪除。 – Benjamin

回答

1

按道理

列表pop方法從索引彈出和刪除它。索引0消失後,您必須彈出的下一個索引是... 0!由於索引0中的元素消失了,因此下一個應刪除的元素已移動爲新的索引0.

遞增x每次在第一次迭代中彈出0時,則爲1(這是第三次元素原始列表)。這就是你從迭代中遺失了一些元素的原因(在迭代for循環之前,你只需將它們除去)。

實際上

真正的問題是pop平本身。當你迭代迭代時,你不應該修改它。如果您想從原始列表中刪除整數,請使用兩個循環 - 一個用於將整數添加到第二個列表,另一個用於將其從第一個列表中刪除。