先理解体会对列表的倒序删除的好处

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]
'''

 

踩同一种坑的三种解法

循环删除list中元素 python 循环删除列表元素_循环删除list中元素 python

循环删除list中元素 python 循环删除列表元素_删除元素_02

'''删除列表中下标为奇数的元素 三段代码都踩了坑'''

# 方法一 错误的方法 遍历列表自身时对列表中的元素进行删除
# 每一次遍历 删除一个元素 列表自身就被改变 剩余元素的索引发生了变化
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]

'''