Python中.remove()的一个坑

首先感谢 大漠苍狼9527 ,记得收藏点赞

做《Python编程从入门到实践》7-8,要从列表中删除相同的一个值,我用了for+remove的方法和while的方法,但是for+remove的方法存在一个问题,删不干净!接下来上代码,

sandwich_orders = ['a', 'b', 'p', 'p', 'c', 'd', 'p']
finished_sandwich = []

print("P has been sold out.\n")

for order in sandwich_orders:
    if order == 'p':
        sandwich_orders.remove(order)

# while 'p' in sandwich_orders:
#     sandwich_orders.remove('p')

while sandwich_orders:
    sandwich = sandwich_orders.pop()

    print("I made your " + sandwich.title() + " sandwich." )

    finished_sandwich.append(sandwich)

print(" ")
print(finished_sandwich)

for+remove的方法会发现有一个p是去不掉的
Python中.remove()的一个坑_第1张图片

while的方法当然是可行的

Python中.remove()的一个坑_第2张图片
那么问题出在哪了呢?

查了资料发现,是for循环捣的鬼。因为for循环实际是循环的列表下标(索引),同时由于列表的可变性,每一次删除一个元素,列表的长度就会发生变化,元素的索引也会发生变化。这里来具体分析一下这段代码:  
第一次循环,循环索引为0,此时索引为0的元素是a,不满足条件。sandwich_orders为[‘a’, ‘b’, ‘p’, ‘p’, ‘c’, ‘d’, ‘p’]
第二次循环,循环索引为1,此时索引为1的元素是b,不满足条件。sandwich_orders为[‘a’, ‘b’, ‘p’, ‘p’, ‘c’, ‘d’, ‘p’]  
第三次循环,循环索引为2,此时索引为2的元素是p,满足条件。sandwich_orders为[‘a’, ‘b’, ‘p’, ‘c’, ‘d’, ‘p’]  
第四次循环,循环索引为3,此时索引为3的元素是c,不满足条件,并且跳过了一个p。sandwich_orders为[‘a’, ‘b’, ‘p’, ‘c’, ‘d’, ‘p’] 
第五次循环,循环索引为4,此时索引为4的元素是d,不满足条件。sandwich_orders为[‘a’, ‘b’, ‘p’, ‘c’, ‘d’, ‘p’] 
第六次循环,循环索引为5,此时索引为5的元素是p,满足条件,但要注意,remove()只删除第一个指定的值(即删除索引为2的那个p)。sandwich_orders为[‘a’, ‘b’, ‘c’, ‘d’, ’p’] 
新列表长度为5,循环结束。

你可能感兴趣的:(Python)