使用关键字for遍历列表元素并且删除列表中指定重复数字,但是出现了我不明白的结果,下面是我运行的代码:
>>>a=[1,1,1,1,1,1]
>>>for i in a:
if i ==1:
a.remove(i)
>>>a
>>>[1,1,1]
我首先创建了一个列表a,然后使用Python中的for遍历一遍列表,如果i值等于1,那么就删除1,我本以为这样操作之后列表a会成为空列表,结果出乎我意料。。。
然后我用while重新试了以下:
>>> a=[1,1,1,1,1,1]
>>> while 1 in a:
a.remove(1)
>>> a
[]
这下全删除干净了。。。
再试试
>>> a=[1,1,1,1,1,1,1,1,1,1,1,1,1,1]
>>> for i in a:
if i ==1:
a.remove(i)
print(a)
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1]
>>> a
[1, 1, 1, 1, 1, 1, 1]
邪乎了,前面的1是1,后面的1就不是1了?到底哪里出问题了呀。。。
接着写:
>>> a=[1,1,1,2,3,4,5,3,1,]
>>> a
[1, 1, 1, 2, 3, 4, 5, 3, 1]
>>> for i in a:
print(i)
1
1
1
2
3
4
5
3
1
>>> for i in a:
if i is 1:
a.remove(1)
>>> a
[2, 3, 4, 5, 3, 1]
>>> a=[1,1,1,1,2,3,4,5,3,1,]
>>> for i in a:
if i is 1:
a.remove(1)
>>> a
[1, 2, 3, 4, 5, 3, 1]
>>> a=[1,1,1,1,1,2,3,4,5,3,1,]
>>> for i in a:
if i is 1:
a.remove(1)
>>> a
[1, 2, 3, 4, 5, 3, 1]
邪乎了,最开始的a列表中的三个1被删除了,然后我又加入往列表a中多加了一个1,总共四个1,操作一遍后删除了3个1,我以为这个代码只会删除3个1,结果我最后再加了一个1,这下好了,5个1删除了4,与上面的4个1得到的结果一样。我要崩溃了。。。
为了一探究竟,我搞了下面的代码:
>>> a=[1,1,1,1,2,3,4,5,3,1,]
>>> for i in a:
print(i)
if i is 1:
print(i,'is 1')
else:
print(i,'is not 1')
1
1 is 1
1
1 is 1
1
1 is 1
1
1 is 1
2
2 is not 1
3
3 is not 1
4
4 is not 1
5
5 is not 1
3
3 is not 1
1
1 is 1
从上面的代码运行情况来看,for循环中的确遍历了整个列表a,可是为嘛就是不执行a.remove(1)这句代码呢?
哦噢,可能是remove这个函数出了问题,我给大家看下改进的代码:
>>> a=[1,1,1,1,2,3,4,5,3,1,]
>>> for i in a:
print(i)
if i is 1:
print(i,'is 1')
a.remove(1)
print(a)
else:
print(i,'is not 1')
print(a)
1
1 is 1
[1, 1, 1, 2, 3, 4, 5, 3, 1]
1
1 is 1
[1, 1, 2, 3, 4, 5, 3, 1]
2
2 is not 1
[1, 1, 2, 3, 4, 5, 3, 1]
3
3 is not 1
[1, 1, 2, 3, 4, 5, 3, 1]
4
4 is not 1
[1, 1, 2, 3, 4, 5, 3, 1]
5
5 is not 1
[1, 1, 2, 3, 4, 5, 3, 1]
3
3 is not 1
[1, 1, 2, 3, 4, 5, 3, 1]
1
1 is 1
[1, 2, 3, 4, 5, 3, 1]
这下各位看官看懂了吗??这下我只看见出现了两个1,没有出现四个1,两个1被删除了,所以遍历不到了。
所以问题的真相只有一个,赋值给变量i的过程出现了问题。。。
各位看官看懂了?
在最后一个我给的代码中可以看出,for循环遍历过程中i在第三次循环中是赋值了2,并没有赋值1,
所以for循环中i的赋值是与当前列表密切相关的,当前是第三次循环,那么就应该是将当前列表第三个数字赋值给i,此时a列表为[1,1,2,3,4,5,3,1],列表a[2]为2,所以赋值为2
,这下我们就知道了漏掉了前面的两个1,而最后的一个1被发现,然后就删除了最前面的一个1,得到[1,2,3,4,5,3,1],解答完毕!
综上,在这里做出一个大胆的直言,对于连续出现1的列表for循环是完成不了完全删除操作的,这与for循环的机制直接有关
那么知道了产生问题的原因,现在还可以使用for来完成这个任务吗?各位大佬有什么好的解决方法吗?
哈哈-- 我解决这个问题,直接用两次循环不就好了!上代码
>>> a=[1, 1, 1, 2, 3, 4, 5, 3, 1, 1]
>>> for i in a:
if i is 1:
a.remove(1)
>>>
>>> a
[2, 3, 4, 5, 3, 1, 1]
>>> a=[1, 1, 1, 2, 3, 4, 5, 3, 1, 1]
>>> for i in a:
print(a)
if i ==1:
a.remove(1)
for x in a:
if x==1:
a.remove(1)
[1, 1, 1, 2, 3, 4, 5, 3, 1, 1]
[2, 3, 4, 5, 3, 1, 1]
[2, 3, 4, 5, 3, 1]
[2, 3, 4, 5, 3]
[2, 3, 4, 5, 3]
问题解决,bingo
>>> a=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,]
>>> for i in a:
print(a)
if i ==1:
a.remove(1)
for x in a:
if x==1:
a.remove(1)
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1]
瞬间打脸。。。上面的代码除掉的1是有限的。算了算了,用for来删除还不如用while,正如python大师说的直接用最简单的方法就好,整那么复杂干嘛。。。