循环删除列表中的元素
先理解体会对列表的倒序删除的好处
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)
绕开坑的一种解法
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] '''

浙公网安备 33010602011771号