list.remove方法在删除元素的时候往往会出现漏删或者索引越界的情况。
问题
给定了一个日期列表(我这边用于判定文件夹是否存在)。
dateList=['2022-05-03', '2022-05-04', '2022-05-06', '2022-05-08', '2022-05-10', '2022-05-12']
如果日期对应文件不存在,我就需要删除列表中对应的日期。
下面给出一段妄图删除所有元素的代码
for date in dateList:
dateList.remove(date)
print(date,dateList)
输出结果如下:
2022-05-03 [‘2022-05-04’, ‘2022-05-06’, ‘2022-05-08’, ‘2022-05-10’, ‘2022-05-12’]
2022-05-06 [‘2022-05-04’, ‘2022-05-08’, ‘2022-05-10’, ‘2022-05-12’]
2022-05-10 [‘2022-05-04’, ‘2022-05-08’, ‘2022-05-12’]
原因
结果分析:
- for循环从索引下标为0开始遍历,
2022-05-03
在第一次循环中被移除。dataList更新为不包含它的新列表[‘2022-05-04’, ‘2022-05-06’, ‘2022-05-08’, ‘2022-05-10’, ‘2022-05-12’]
- 第二次循环中,索引下标从1开始遍历,
2022-05-06
被移除。dataList更新为 [‘2022-05-04’, ‘2022-05-08’, ‘2022-05-10’, ‘2022-05-12’]
- 第三次循环中,索引下标从2开始遍历,
2022-05-10
被移除。dataList更新为 ['2022-05-04', '2022-05-08', '2022-05-12']
- 第四次循环中,索引下标从3开始遍历,发生索引越界,退出循环
解决
解决方法一(索引倒序遍历):
如果让索引倒序遍历列表就不会出现越界的问题了。
这样就算新列表的长度减小了,那么i 的取值是倒着取的,列表缺少一个元素对 i 的取值无影响。
例如 i 为3 的元素被删除了,新列表最高索引为2 而此时 i的下一个取值正好是 2 ,没有影响。
dateList=['2022-05-03', '2022-05-04', '2022-05-06', '2022-05-08', '2022-05-10', '2022-05-12']
for i in range(len(dateList)-1,-1,-1):
dateList.remove(dateList[i])
print(dateList)
输出结果:空列表
[]
解决方法二(新建一个列表保存结果):
如果让索引倒序遍历列表就不会出现越界的问题了。
这样就算新列表的长度减小了,那么i 的取值是倒着取的,列表缺少一个元素对 i 的取值无影响。
例如 i 为3 的元素被删除了,新列表最高索引为2 而此时 i的下一个取值正好是 2 ,没有影响。
dateList=['2022-05-03', '2022-05-04', '2022-05-06', '2022-05-08', '2022-05-10', '2022-05-12']
dateItems = []
for i in range(len(dateList)-1,-1,-1):
if os.path.isfile(path):
dateItems.append(dateList[i])
print(dateItems)