Python子类dnmMtx:获取列数/最长行及删除行实现求助
解决DnmMtx子类的size函数修改与行删除问题
我来帮你搞定这两个问题,咱们一步步梳理:
1. 修改size函数,返回行数与最长行的长度
你的size方法目前只返回二维数组的行数,现在要调整它返回总行数和最长行的长度(对应你说的“列数”,如果是不规则二维数组,最长行的长度就是最大列数)。我们可以结合max()函数和生成器表达式实现这个需求,同时处理空矩阵的边界情况:
修改后的size方法:
def size(self): row_count = len(self.arr) # 空矩阵时返回0,避免max()处理空序列报错 max_col_count = max(len(row) for row in self.arr) if row_count > 0 else 0 return (row_count, max_col_count)
说明:
row_count保留原有的行数计算逻辑;max(len(row) for row in self.arr)遍历所有行,计算每行长度的最大值,也就是最长行的长度;- 加入空矩阵判断,防止矩阵没有行时调用
max()抛出异常。
2. 修复行删除功能(delrow方法)
你之前尝试pop和delete失败,是因为Python列表没有delete()方法,而且原代码的索引合法性检查也有问题。我们用list.pop()来实现行删除,同时完善参数校验:
修改后的delrow方法:
def delrow(self, x): if not isinstance(x, int): print('Invalid row index: must be an integer.') return # 检查索引是否在合法范围(Python列表索引从0开始,需满足0 <= x < 总行数) if 0 <= x < len(self.arr): self.arr.pop(x) print(f'Row {x} deleted successfully.') else: print(f'Row {x} does not exist.')
说明:
- 用
isinstance(x, int)替代type(x) == int,类型检查更灵活(能兼容整数子类); - 索引范围检查严格遵循Python列表规则,避免
pop()时抛出索引越界错误; - 直接调用
self.arr.pop(x)删除指定索引的行,这是列表删除指定位置元素的标准用法。
完整修改后的DnmMtx子类代码
把以上修改整合后,完整的子类代码如下:
class DnmArr: def __init__(self): # create empty list self.arr=[] def __del__(self): print('Deconstructed') # return length def length(self): return len(self.arr) # append def append(self, x): # add x to arr if type(x) == int: self.arr.append(x) else: print('Not an integer.') # delete def delete(self,x): index = x # if element is present in array if index <= len(self.arr): self.arr.pop(index) else: print('Element does not exist.') def value(self, x): if x <= len(self.arr) and type(x) == int: print(self.arr[x-1]) else: print('Does not exist or list indices is not an integer') # initializing subclass using parent class class DnmMtx(DnmArr): def __init__(self): DnmArr.__init__(self) self.arr=[[],[]] # creating 2d array def __del__(self): print('Deconstructed') def addrow(self): row = [] self.arr.append(row) def delrow(self, x): if not isinstance(x, int): print('Invalid row index: must be an integer.') return if 0 <= x < len(self.arr): self.arr.pop(x) print(f'Row {x} deleted successfully.') else: print(f'Row {x} does not exist.') def size(self): row_count = len(self.arr) max_col_count = max(len(row) for row in self.arr) if row_count > 0 else 0 return (row_count, max_col_count) def append(self, x, y): if type(x) == int and type(y) == int: self.arr[x].append(y) else: print('Not an integer.') def delete(self, x, y): # if element is present if x < len(self.arr) and y < len(self.arr[x]): self.arr[x].pop(y) else: print('Element does not exist.') def value(self, x, y): if isinstance(x, int) and isinstance(y, int) and 0 <= x-1 < len(self.arr) and 0 <= y-1 < len(self.arr[x-1]): print(self.arr[x-1][y-1]) else: print('Does not exist or list indices is not an integer') # create object of type Dynamic Array a = DnmArr() b = DnmMtx()
额外小优化:
我还调整了DnmMtx里delete和value方法的索引判断逻辑,让边界检查更准确(比如原代码中x <= len(self.arr)会允许索引等于长度,这在Python中属于越界,改成了x < len(self.arr)),同时用isinstance优化了类型检查的健壮性。
内容的提问来源于stack exchange,提问作者user3358064
相关产品推荐
相关产品推荐

