Python 不';t pop()如果一个数字跟在一个数字后面
该代码应清除列表中的“包”。但如果数字跟在数字后面,它就不能正常工作。例如7之后的8Python 不';t pop()如果一个数字跟在一个数字后面,python,Python,该代码应清除列表中的“包”。但如果数字跟在数字后面,它就不能正常工作。例如7之后的8 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)
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']
在迭代列表时不要试图修改它
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
你是。这将导致意外行为
相反,您可以使用列表理解:
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)
删除元素时,列表中的以下项目都会被移回一个索引。但是,用于..的迭代器。。在
中,循环无法知道这个移位,因此当它调用其next()
函数时,它实际上会跳过一个元素
如果直接在循环头之后添加一个
print(i)
,您将看到每次从列表中弹出一个数字时,中的以下列表条目都会被跳过。。在
循环中(无论它是否为数字)。如果它不是一个数字,你就不会注意到它,因为字符串无论如何都应该留在列表中。列表理解比map
更快,因为map
通常需要一个用户定义的函数来包装应用于每个项目的操作。如果只是筛选列表,则必须在列表上迭代两次(或更多)将比为循环编写单个要慢。@chepner这肯定是正确的,如果性能是一个问题,我自己也会选择单循环选项。然而,只要列表不是太大或者性能不是问题,速度上的差异就不会真正影响整个运行时。“意外行为”正是让我这么做的原因。它期待着我。而且一直都很好,除非数字是数字。这有点奇怪。@zero我已经补充了一些关于“意外行为”的解释,以及它实际上从来都不起作用的事实,但你只是没有注意到它,因为它似乎起作用了。谢谢你的回复。我也在用同样的方法来克服这个障碍:而且效果很好。但这种最初鳕鱼的行为对我来说很奇怪,看起来像一只虫子袋子里的苹果,香蕉,土豆,西红柿,香蕉,土豆,西红柿,2,查理,3,mo4ka,7,8,糖果,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食,主食`