2016-11-05 30 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

相关问题