首先感谢 大漠苍狼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)
while的方法当然是可行的
查了资料发现,是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,循环结束。