Python中出现IndexError:编写正整数列表过滤函数时索引报错
解决列表过滤正整数时的索引错误问题
你这段代码出现索引错误的核心原因是遍历过程中修改了列表长度:
- 一开始你获取了列表的初始长度
le,循环用range(le)生成固定的索引序列,但每次执行pop(i)删除元素后,列表的实际长度会减少,当循环到后面的索引时,这个索引已经超出了当前列表的有效范围,自然就抛出索引错误了。 - 另外,你的需求是保留正整数,但当前代码会把0也留下来,这也是个需要修正的小问题。
方案1:反向遍历列表
从列表的最后一个元素往前遍历,这样删除元素不会影响前面未遍历的元素索引:
def filter_positive_list(raw_data): # 从后往前遍历索引 for i in range(len(raw_data)-1, -1, -1): # 只保留大于0的数,小于等于0的都删除 if raw_data[i] <= 0: raw_data.pop(i) data = [-3, -2, -1, 0, 1, 2, 3] filter_positive_list(data) print(data) # 输出: [1, 2, 3]
方案2:使用列表推导式(创建新列表)
如果允许返回新列表而不是修改原列表,列表推导式更简洁直观:
def filter_positive_list(raw_data): # 直接生成只包含正整数的新列表 return [num for num in raw_data if num > 0] data = [-3, -2, -1, 0, 1, 2, 3] filtered_data = filter_positive_list(data) print(filtered_data) # 输出: [1, 2, 3]
方案3:切片赋值修改原列表
如果必须修改原列表,也可以用列表推导式生成新列表后,通过切片赋值覆盖原列表:
def filter_positive_list(raw_data): # 切片赋值,直接修改原列表 raw_data[:] = [num for num in raw_data if num > 0] data = [-3, -2, -1, 0, 1, 2, 3] filter_positive_list(data) print(data) # 输出: [1, 2, 3]
内容的提问来源于stack exchange,提问作者cherishroby
相关产品推荐
相关产品推荐

