编写median_filter函数时出现TypeError: list indices must be integers or slices, not float错误的原因及解决方法
分析与修复median_filter函数的TypeError问题
咱们先拆解你遇到的错误:TypeError: list indices must be integers or slices, not float,这个问题出在你写的列表推导式里——你写了for i in y,这里的i是y列表里的元素值(比如-1.0、6.0这些浮点数),但你却用它来做列表索引y[i-W],列表的索引只能是整数,自然就报错了。
除此之外,你的代码还有几个逻辑问题:
- 每次循环都把
ynew = []重置为空,最后只会保留最后一次循环的结果(甚至可能是空的); - 边界条件处理错误,比如当
i-W < 0时,你固定取[y[0], y[1]],这不符合题目要求的“从0到i+W的窗口”; - 循环变量混淆,外层循环已经用了
i作为索引,内层列表推导式又用i遍历y的元素,完全打乱了逻辑。
修复后的完整代码
首先确保你有一个正确的my_median函数(如果还没实现的话):
def my_median(lst): sorted_lst = sorted(lst) n = len(sorted_lst) mid = n // 2 if n % 2 == 1: return sorted_lst[mid] else: return (sorted_lst[mid-1] + sorted_lst[mid]) / 2
然后修复median_filter函数:
def median_filter(y, W): ''' (list, int) -> list Returns a list whose ith item is the median value of y[start:stop+1] where start is the larger of 0 and i - W and stop is the smaller of i + W and n-1. >>> median_filter([-1.0, 6.0, 7.0, -2.0, 0.0, 8.0, 13.0], 1) [2.5, 6.0, 6.0, 0.0, 0.0, 8.0, 10.5] ''' ynew = [] # 把结果列表初始化放在循环外,避免每次清空 n = len(y) for i in range(n): # 计算当前窗口的起始和结束索引,确保不越界 start = max(0, i - W) stop = min(i + W, n - 1) # 获取窗口内的所有元素(切片左闭右开,所以stop+1才能包含stop位置) window = y[start:stop+1] # 计算中位数并加入结果列表 ynew.append(my_median(window)) return ynew
关键修复点说明
- 变量作用域修正:把
ynew的初始化移到循环外面,这样每次循环计算的中位数都会被保留下来; - 正确计算窗口范围:用
max(0, i-W)和min(i+W, n-1)自动处理边界情况,不需要写多个if判断; - 避免变量混淆:直接用
range(n)遍历每个索引i,清晰对应每个位置的窗口计算; - 简化窗口获取:通过切片
y[start:stop+1]直接拿到窗口内的所有元素,不用手动拼接元素,减少错误。
测试一下你的样例输入:
print(median_filter([-1.0, 6.0, 7.0, -2.0, 0.0, 8.0, 13.0], 1))
会得到预期的结果:[2.5, 6.0, 6.0, 0.0, 0.0, 8.0, 10.5]。
内容的提问来源于stack exchange,提问作者ashnotallyson
相关产品推荐
相关产品推荐

