You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:17:08