用pop方法删除列表中的重复的值会报错怎么办?

用pop方法删除列表中的重复的值会报错怎么办?

今天有个同学发了个问题给松勤学院,说他打算用pop删除某个列表里的重复的值,但感觉怎么删都报错.

我们先看一下他的源代码.

list1 = [11, 22, 33, 22, 22, 63, 53, 22, 22, 32]
for i in range(len(list1)):
   
if list1[i] == 22:
        list1.pop(i)

print(list1)

他的想法是遍历列表,判断列表的某一位是不是22,如果是22,就删除.

他的思路似乎没啥问题,实际运行一下.

 

提示下标越界.为什么会越界呢?我们把print()放到循环里,观察列表的变化

list1 = [11, 22, 33, 22, 22, 63, 53, 22, 22, 32]

for i in range(len(list1)):

    if list1[i] == 22:

        list1.pop(i)

    print(list1,i)

运行结果如下

从图中可以得知,每次pop()方法删除一个值时,列表的长度就会变小.但是循环里的i一直变大,直到i大于了列表的最大下标,程序报错.

如果使用pop遍历列表进行删除会报错,是不是无法使用pop进行删除呢?其实也可以删除.

我们可以换个思路,从后向前进行删除

for i in range(len(list1)-1, -1, -1):

    if list1[i] == 22:

        list1.pop(i)

print(list1)
 
运行结果
 
 

 

有的同学可能就疑惑了,为什么之前不可以删除,但是换个方向就可以删除呢?
其实是因为从前向后删除时,当有数据被删除,则每个数值的下标会发生变化,如果i的值大于最大下标,就会下标越界.如果从后向前删除,前面的数值的下标未发生变化,i的值也是逐渐变小,不会出现越界.
 
以上就是解决pop删除列表数据时,下标越界的解决方法.
 
也可以使用append的方式,实现列表重复数值的删除.思路是新建一个空列表,如果list1的某个值不是22,则将这个值添加到list2,遍历list1之后,list2就是删除22之后的list1
list1 = [11, 22, 33, 22, 22, 63, 53, 22, 22, 32]
list2 = []

for i in range(len(list1)):

    if list1[i] != 22:

        list2.append(list1[i])

print(list2)
 
运行结果
 

 

 
现在我们把这位同学的需求改一下,如果题目需求为:删除列表中的所有的重复的值,应该怎么做呢?
这个需求和刚才的不同在于,刚才的需求是要删除所有的22,现在是不重复就不用删.
可以这样,set()函数把对象转为集合,之后再转回list,在转set的过程中,set自动去掉重复的值,这样就可以实现去重.
 
代码如下
list1 = [11, 22, 33, 22, 22, 63, 53, 22, 22, 32]

set1=list(set(list1))

print(set1)
 
 
运行结果
 

 


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值