python中删除‘指定值的元素’可以直接通过remove()实现比较简单。
但是删除多个index对应的元素,却比较麻烦,如果缺少积累,可能需要花很多时间去思考。
0、问题引入
idx = [0, 1, 2]
a = ['a', 'b', 'c', 'd', 'e', 'f']
问题:删除idx中元素作为索引的a中的元素?
即,idx是a中需要删除的元素的索引
一、错误方法1、
如果写为:
for i in idx:
del a[i]
这样是错误的,因为随着a中的元素被删除,a中的index是发生了变化的
二、错误方法2、
如果写为
for idx0, elem in enumerate(a):
if idx0 in idx:
del a[idx0]
这样也是不可以的,因为随着a中的元素被删除,a中的index也是发生了变化的,
for那里的a一直在变化
错误方法2的实例展示:
例①:
b = [1, 2, 3]
for i, ele in enumerate(b):
print('ppp', i, ele)
if i == 0:
del b[i]
print(b)
返回:
ppp 0 1
[2, 3]
ppp 1 3
[2, 3]
例②:
b = [1, 2, 3]
num = 0
for i in b:
num += 1
del b[0]
print(b, num) #最后一个元素被删除后,内存中没有b这个对象了,所以没有num==3
返回:
[2, 3] 1
[3] 2
例③:
b = [1, 2, 3]
num = 0
for i, ele in enumerate(b):
print('ppp', i, ele)
num += 1
del b[0]
print(b, num)
返回:
ppp 0 1
[2, 3] 1
ppp 1 3
[3] 2
三、 唯一正确的方法:
把idx倒过来
for i in reversed(idx):
del a[i]
这样就可以保证前面的元素的index不发生改变
其实也可以通过sorted()把索引的大小顺序反过来。
补充:
del 语句能进行切片删除;且能删除变量。
clear,是毁灭性的删除;
remove,指定元素删除,只能删除第一个同名的元素。
pop ,指定索引删除,只能删除一个,且默认不写索引,有和append相反的功能。