【问题标题】:Create a jagged/ragged array in Python using classes and methods使用类和方法在 Python 中创建锯齿状/锯齿状数组
【发布时间】:2020-11-24 22:02:12
【问题描述】:

我需要在 Python 中创建一个参差不齐的二维网格,它有 3 行,其中第一行有 3 列,第 2 行 - 6 列,第 3 行 - 9 列。所有这些都应该在不使用任何包(如 NumPy 或其他任何包)的情况下完成,只需使用以下示例中的类和方法。这是我如何创建常规二维数组的示例

class newArray ():
    def __init__(self, capacity, fill = None):
        self.item = list()
        for count in range (capacity):
            self.item.append(fill)
            
    def __str__(self):
        return str (self.item)
    
    def __len__(self):
        return len(self.item)
    
    def __iter__(self):
        return iter(self.item)
    
    def __getitem__(self, index):
        return self.item[index]
    
    def __setitem__(self, index, newItem):
        self.item[index] = newItem
        
class raggedGrid():
    
    def __init__(self, rows, cols):
        self.data = newArray(rows)
        for row in range(rows):
            self.data[row] = newArray(cols)
        
                    
    def getRows(self):
        return len(self.data)
    
    def getCols(self):
        return len(self.data[0])
    
    def __getitem__(self, index):
        return self.data[index]
    
    def __setitem__(self, index, newItem):
        self.data[index] = newItem
    
    def __str__(self):
        result = '\n'
        for row in range(self.getRows()):
            for col in range(self.getCols()):
                result += str(self.data[row][col]) + ' '
            result += '\n'
        return result

声明后会打印出一个网格

a = raggedGrid(4,4)
print(a)


None None None None 
None None None None 
None None None None 
None None None None 

我卡住了,不知道从哪里开始

【问题讨论】:

    标签: python arrays grid ragged


    【解决方案1】:

    这里是raggedGrid类的修改版:

    class raggedGrid():
        
        def __init__(self, rows, *col_lengths):
            self.data = newArray(rows)
            for row in range(rows):
                self.data[row] = newArray(col_lengths[row])
            
                        
        def getRows(self):
            return len(self.data)
        
        def getCols(self, row_index=None):
            if row_index is None:
                return [len(self.data[row]) for row in self.data]
            else:
                return len(self.data[row_index])
        
        
        def __getitem__(self, index):
            return self.data[index]
        
        def __setitem__(self, index, newItem):
            self.data[index] = newItem
        
        def __str__(self):
            result = '\n'
            for row_index in range(self.getRows()):
                for col_index in range(self.getCols(row_index)):
                    result += repr(self.data[row_index][col_index]) + ' '
                result += '\n'
            return result
    

    这是一个示例用法:

    a = raggedGrid(4,2,7,16,3) # Four row, having respective lengths of 2,7,16,3
    print(a)
    a[1][4] = "Val at [1][4]"
    a[2][13] = "Val at [2][13]"
    print ("Printing a after some elements were assigned")
    print (a)
    

    【讨论】:

    • 非常感谢。我明白了
    • 只是想澄清 * 在 col_lengths 参数附近是什么意思?当我删除它时,我得到一个错误''__init__() 需要 3 个位置参数,但给出了 5 个''。
    • 这意味着,在我们调用该函数的地方,允许零个或多个参数出现在该位置的 arg-list 中,而不仅仅是一个参数。在这里,我们希望在调用该函数时传递多个 col-length,而不仅仅是一个 col-length。
    • __init__() 的进一步简化如下:代替def __init(self, rows, *col_lengths):,只需使用def __init(self, *col_lengths):。然后,在__init__() 的主体内,您应该将rows 的值设为rows = len(col_lengths)。这意味着,在调用函数的地方,我们不必传递rows 的值。我们只是传递逗号分隔的 col-lengths(我们现在已经传递了)。如果我们传递五个这样的 col-length,则意味着 rows 的值是 5
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多