关于在list的值在循环中remove时出现的错误的总结

# coding:utf-8
a = [1,2,1,3,1,4,1,5,1,6,2,7,1,8]
for b in a :
    if b == 1:
        a.remove(b)
    elif b == 2:
        a.remove(b)
    elif b ==3:
        a.remove(b)
    elif b == 4:
        a.remove(b)
    elif b == 5:
        a.remove(b)
    elif b == 6:
        a.remove(b)
    elif b == 7:
        a.remove(b)
    elif b == 8:
        a.remove(b)
print a
'''
关于在列表的值在循环中remove是出现的错误的总结
上面的结果理论上应该是a = []
实际上结果是[3, 4, 5, 6, 2, 7, 8]

原因是:
list.remove(a) 移除列表中第一个与a匹配的值
for in 是按下标进行迭代的
实际过程是
a = [1,2,1,3,1,4,1,5,1,6,2,7,1,8]
 b = a[0]  b = 1
a.remove(1)
此时a = [2,1,3,1,4,1,5,1,6,2,7,1,8]
然后
b = a[1] -> b = 1 
a.remove(1)
此时a = [2,3,1,4,1,5,1,6,2,7,1,8]
b = a[2] -> b = 1 
a.remove(1)
此时a = [2,3,4,1,5,1,6,2,7,1,8]
b = a[3] -> b = 1
a.remove(1)
此时a = [2,3,4,5,1,6,2,7,1,8]
b = a[4] -> b = 1
a.remove(1)
此时 a = [2,3,4,5,6,2,7,1,8]
b = a[5] -> b = 2
a.remove(2)
此时 a = [3,4,5,6,2,7,1,8]
b = a[6] -> b = 1
a.remove(1)
此时 a = [3,4,5,6,2,7,8]

列表搜索到最后一个下标了 循环结束

'''
# 解决办法1
a = [1,2,1,3,1,4,1,5,1,6,2,7,1,8]
list = []
for b in a :
    if b == 1:
        a.remove(b)
    elif b == 2:
        a.remove(b)
    elif b ==3:
        a.remove(b)
    elif b == 4:
        a.remove(b)
    elif b == 5:
        a.remove(b)
    elif b == 6:
        a.remove(b)
    elif b == 7:
        a.remove(b)
    elif b == 8:
        a.remove(b)
    else:
        list.append(b)
print list

# 结果为空
# 解决方法 2
a = [1,2,1,3,1,4,1,5,1,6,2,7,1,8]
for b in a[:] :
    if b == 1:
        a.remove(b)
    elif b == 2:
        a.remove(b)
    elif b == 3:
        a.remove(b)
    elif b == 4:
        a.remove(b)
    elif b == 5:
        a.remove(b)
    elif b == 6:
        a.remove(b)
    elif b == 7:
        a.remove(b)
    elif b == 8:
        a.remove(b)
print a
# 原因是a  a[:] 是两个不同的对象 不过它们两个对象储存的内容是一样的 
# 例如两个男人一个叫张三 一个叫李四 虽然名字不一样 但他们都是男人  (大致的一个比喻)
#  a [:]中遍历的是a[]中每一个值 没有remove()来改变a[:]的内容

参考:http://blog.csdn.net/guan666/article/details/71511948
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值