2016-11-05 29 views
2

該代碼應該清除數字中的'bag'列表。但是號碼後面跟着一個數字就不適用。例如8後7如果一個數字跟在數字後面,不會彈出()

bag = ['apples', 1,'bananas', 'potatoes', 'tomatoes',2, 'chary',3, 'mo4ka', 7,8, 'candies', 'Main_TX'] 
list_n = [] 
x = 0 
for i in bag: 
    if isinstance(i, int): 
     list_n.append(i) 
     bag.pop(x) 
    x+=1 

print(list_n) 
print(bag) 

結果:

[1, 2, 3, 7] 
['apples', 'bananas', 'potatoes', 'tomatoes', 'chary', 'mo4ka', 8, 'candies', 'Main_TX'] 

回答

4

不要嘗試,而你是遍歷它來修改的列表。

list_n = [] 
new_bag = [] 
for x in bag: 
    # which_list = list_n if isinstance(x, int) else new_bag 
    # which_list.append(x) 
    if isinstance(x, int): 
     list_n.append(x) 
    else: 
     new_bag.append(x) 
bag = new_bag 
+0

感謝您的回覆。 我一直在想辦法克服這個障礙: 它運作良好。但是初始鱈魚的這種行爲對我來說很奇怪,看起來像一個bug。 袋= ['蘋果',1,'香蕉','土豆','西紅柿',2,'chary',3,'mo4ka',7,8,'糖果','Main_TX'] list_n = [] list_a = [] 對於i在袋: 如果isinstance(I,強度): list_n.append(ⅰ) 否則:list_a.append(ⅰ) 打印(list_n) 打印(list_a) print(bag) ' – zero

1

您是modifying your list while iterating。這會導致意想不到的行爲。

相反,你可以使用列表理解:

list_n = [e for e in bag if isinstance(e, int)] 
bag = [e for e in bag if not isinstance(e, int)] 

的具體原因,你的代碼不起作用的是,每次你刪除一個元素與bag.pop(x)列表中的下列項目獲得轉移回來一個索引。但是,由for .. in循環使用的迭代器不能知道關於這種轉換,因此當它調用它的next()函數時,它本質上將跳過一個元素。

如果循環的頭後直接添加print(i)你會看到,每一個號碼從以下列表條目在for .. in循環跳過(不管它是數字或沒有)列表彈出時間。如果它不是一個數字,你只是不會注意到它,因爲字符串本來應該留在列表中。

+1

列表推導是map更快的替代方法,因爲'map'通常需要用戶定義的函數來包裝應用於每個項目的操作。如果你僅僅是過濾一個列表,不得不遍歷列表兩次(或更多)比寫單個'for'循環要慢。 – chepner

+0

@chepner這絕對是真的,如果性能是一個問題,我也可以自己選擇單循環選項。但是,只要列表不是太大或性能不是問題,速度的差異並不會影響整體運行時間。 – Keiwan

+0

「意外的行爲」正是我所想的。它看起來向我邁進了一步。並且一直工作良好,除了數字休閒數字。那有點奇怪。 – zero

相關問題