先理解体会对列表的倒序删除的好处
data = [11, 22, 33]
for i in data: # for循环对可迭代对象的遍历 依靠索引 对象中index=0的元素 index=1的元素 每删一次 对象自身发生了变化!
print("本次将删除元素:", i)
data.remove(i)
print("删除后的列表变成:", data)
print("最终结果", data)
print("==============从列表尾端倒序删除元素==================")
data = [11, 22, 33]
for i in data[::-1]:
print("本次将删除元素:", i)
data.remove(i)
print("删除后的列表变成:", data)
print("最终结果", data)
实际题目的解决
data = [1, 22, 13, 44, 21, 56]
for i in data[::-1]:
print("遍历获取到的元素:", i)
if data.index(i) % 2 != 0:
print("该元素'{}'的下标为{}是个奇数".format(i, data.index(i) ))
data.remove(i)
print("删除后的列表变成:", data)
print("最终结果", data)
'''
遍历获取到的元素: 56
该元素'56'的下标为5是个奇数
删除后的列表变成: [1, 22, 13, 44, 21]
遍历获取到的元素: 21
遍历获取到的元素: 44
该元素'44'的下标为3是个奇数
删除后的列表变成: [1, 22, 13, 21]
遍历获取到的元素: 13
遍历获取到的元素: 22
该元素'22'的下标为1是个奇数
删除后的列表变成: [1, 13, 21]
遍历获取到的元素: 1
最终结果 [1, 13, 21]
'''
踩同一种坑的三种解法
'''删除列表中下标为奇数的元素 三段代码都踩了坑'''
# 方法一 错误的方法 遍历列表自身时对列表中的元素进行删除
# 每一次遍历 删除一个元素 列表自身就被改变 剩余元素的索引发生了变化
lst = [1, 22, 13, 44, 21, 56]
for el in lst:
if lst.index(el) % 2 == 0:
lst.pop(el) # IndexError: pop index out of range
print(lst)
print("----------------------------------")
# 方法二 同样是错误的方法
lst = [1, 22, 13, 44, 21, 56]
for i in range(len(lst)):
if i % 2 != 0:
del lst[i]
print(lst)
print("----------------------------------")
# 方法三 错误方法 借助记录下标的列表 按索引从前向后删除
lst = [1, 22, 13, 44, 21, 56]
index_list = [n for n in range(len(lst)) if n % 2 != 0] # 列表推倒式
print("待删除元素的下标 构成的列表", index_list)
for i in index_list:
print(i)
del lst[i] # IndexError: list assignment index out of range
print(lst)
print("删除后的列表", lst)
View Code
绕开坑的一种解法
lst = [1, 22, 13, 44, 21, 56]
del_list = [lst[n] for n in range(len(lst)) if n % 2 != 0] # 列表推倒式
print("待删除元素构成的新列表", del_list)
for i in del_list:
print("本次删除原列表中的元素", i)
lst.remove(i)
print("本次删除后 原列表变为", lst)
print("最终列表", lst)
'''
待删除元素构成的新列表 [22, 44, 56]
本次删除原列表中的元素 22
本次删除后 原列表变为 [1, 13, 44, 21, 56]
本次删除原列表中的元素 44
本次删除后 原列表变为 [1, 13, 21, 56]
本次删除原列表中的元素 56
本次删除后 原列表变为 [1, 13, 21]
最终列表 [1, 13, 21]
'''