Python使用位置参数调用函数遇问题:给定代码故障成因排查
问题分析与修复方案
咱们直接拆解你的代码问题:既有类方法定义不符合Python规范导致的参数调用异常,还有中位数计算逻辑完全偏离需求的问题,一个个说清楚:
一、位置参数调用异常的直接原因
在Python类中,实例方法的第一个参数必须是self(用来指代类的实例本身),但你的findMedianSortedArrays方法没有这个参数。如果尝试像这样调用:
sol = Solution() sol.findMedianSortedArrays([1,3], [2])
Python会自动把sol这个实例作为第一个参数传入方法,但你的方法只定义了n1和n2两个参数,立刻就会触发TypeError: findMedianSortedArrays() takes 2 positional arguments but 3 were given的异常。
如果不想用实例方法,也可以给方法加上@staticmethod装饰器,把它改成静态方法,这样就不需要self参数了。
二、中位数计算逻辑的核心错误
你的代码里用n3 = n1 + n2是numpy数组的元素级相加,不是合并两个数组。比如n1 = [1,2],n2 = [3,4],执行后n3会是[4,6],这完全不是把两个数组的所有元素整合到一起。就算你想求平均值,这也不是两个数组所有元素的平均值,更别说中位数了。
正确的中位数计算步骤应该是:
- 合并两个输入的有序数组
- 对合并后的数组排序(如果输入本身是有序的,其实可以用双指针法实现O(log(m+n))的高效算法,这里先从基础实现说起)
- 根据数组长度的奇偶性计算中位数:
- 长度为奇数时,取中间位置的元素
- 长度为偶数时,取中间两个元素的平均值
修复后的代码示例
方案1:使用实例方法
import numpy as np class Solution(): # 添加self参数,符合实例方法规范 def findMedianSortedArrays(self, n1, n2): # 合并两个数组,而非元素级相加 merged = np.concatenate([np.array(n1), np.array(n2)]) # 对合并后的数组排序 merged_sorted = np.sort(merged) length = len(merged_sorted) if length % 2 == 1: # 奇数长度,返回中间元素 return merged_sorted[length // 2] else: # 偶数长度,返回中间两元素的平均值 mid_left = merged_sorted[(length // 2) - 1] mid_right = merged_sorted[length // 2] return (mid_left + mid_right) / 2 # 调用示例 sol = Solution() print(sol.findMedianSortedArrays([1,3], [2])) # 输出2.0 print(sol.findMedianSortedArrays([1,2], [3,4])) # 输出2.5
方案2:使用静态方法
import numpy as np class Solution(): @staticmethod def findMedianSortedArrays(n1, n2): merged = np.concatenate([np.array(n1), np.array(n2)]) merged_sorted = np.sort(merged) length = len(merged_sorted) if length % 2 == 1: return merged_sorted[length // 2] else: mid_left = merged_sorted[(length // 2) - 1] mid_right = merged_sorted[length // 2] return (mid_left + mid_right) / 2 # 调用示例 print(Solution.findMedianSortedArrays([1,3], [2])) # 输出2.0
内容的提问来源于stack exchange,提问作者daturm girl
相关产品推荐
相关产品推荐

