如果数字跟在数字后面,则不会弹出()

时间:2016-11-05 18:50:50

标签: 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)
    x+=1

print(list_n)
print(bag)

结果:

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

2 个答案:

答案 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循环中都会跳过以下列表条目(无论是否这是一个数字或不是)。如果它不是一个数字,你就不会注意到它,因为字符串应该保留在列表中。