该代码应清除数字中的“包”列表。但是数字跟随一个数字,它不能正常工作。例如,在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)
x+=1
print(list_n)
print(bag)
结果:
[1, 2, 3, 7]
['apples', 'bananas', 'potatoes', 'tomatoes', 'chary', 'mo4ka', 8, 'candies', 'Main_TX']
答案 0 :(得分: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
答案 1 :(得分: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()
函数时,它实际上将跳过一个元素。 / p>
如果在循环开头后直接添加print(i)
,您将看到每次从列表中弹出一个数字时,for .. in
循环中都会跳过以下列表条目(无论是否这是一个数字或不是)。如果它不是一个数字,你就不会注意到它,因为字符串应该保留在列表中。