用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)
运行结果