【问题标题】:Python Iterate 2D array __iter__Python迭代二维数组__iter__
【发布时间】:2015-04-04 10:18:05
【问题描述】:

我正在尝试创建一个 2D Array 类并希望使矩阵可迭代。有谁知道该怎么做?我是 python 类的新手,但仍然掌握了窍门。另外,str 将如何在我的 main 中实现?如果我只使用 print(customMatrix) 会去使用 str 方法吗?

这就是我正在做的事情。我知道其中一些是不正确的:)

class Array2D():
    def __init__(self, height, width):
        self._width = width
        self._height = height
        self.matrix = [[None]*height for _ in range(width)]

    def width(self):
        return self._width

    def height(self):
        return self._height

    def set(self, row, col, element):
        self.matrix[row][col] = element

    def get(self, row, col):
        return self.matrix[row][col]

    def row(self, row_no):
        rowList = []
        for item in self.matrix[row_no][item]:
            rowList.append(item)

    def column(self, col_no):
        colList = []
        for item in self.matrix[item][col_no]:
            colList.append(item)

    def __str__(self):
        #for row in self.matrix:
            #print (row)
        return (str(self.matrix))

    def __iter__(self):

【问题讨论】:

    标签: python list class loops 2d


    【解决方案1】:

    实际上有一个yield关键字在这种情况下很方便,它可以被认为是一个return语句,它在返回任何东西的同时保存以前的状态,所以当你调用该方法时,它首先会产生self.matrix[0][0]第二次调用这个方法会产生self.matrix[0][1]等等..

    class Array2D():
        def __init__(self, height, width):
            self._width = width
            self._height = height
            self.matrix = [[None]*height for _ in range(width)]
    
        def width(self):
            return self._width
    
        def height(self):
            return self._height
    
        def set(self, row, col, element):
            self.matrix[row][col] = element
    
        def get(self, row, col):
            return self.matrix[row][col]
    
        def row(self, row_no):
            rowList = []
            for item in self.matrix[row_no][item]:
                rowList.append(item)
    
        def column(self, col_no):
            colList = []
            for item in self.matrix[item][col_no]:
                colList.append(item)
    
        def __str__(self):
        return_str = ""
        for i in xrange(self._height):
            for j in xrange(self._width):
                return_str+=str(self.matrix[i][j])+"    " #4 space between each element
            return_str+="\n"
        return return_str
    
        def __iter__(self):
            for i in xrange(self._height):
                for j in xrange(self._width):
                    yield self.matrix[i][j]
    

    【讨论】:

    • 每当调用 str 方法时,我都会收到“IndexError: list index out of range”。有什么想法吗?
    • 很抱歉给您带来不便,我已修复
    • 这对您的系统有效吗?我知道 str 正在返回非字符串类型。
    • 我一直认为 str_ 应该返回一个字符串,而不是实际打印一些东西。我将其更改为 return str(self.matrix[i][j]) + " " 现在它只打印出第一个“none”。由于某种原因,它没有循环通过
    【解决方案2】:
    def __iter__(self):
        for x in xrange(self.width):
             for y in xrange(self.height):
                yield self.matrix[x][y]
    

    阅读生成器和 yield 关键字,它们使用起来很有趣!

    【讨论】:

    • 太棒了,不知道产量。如何迭代 2D 列表以打印包含每个项目的字符串?我希望它像矩阵一样格式化(每行后换行)
    • 在我的回答中实现了__str__,您可以查看@ncerice
    • @ncerice 注意:使用itertools.chain.from_iterable 方法,您可以将__iter__ 简单地定义为:def __iter__(self): return chain.from_iterable(self.matrix)。你一定要看看那个模块,它有很多非常有用的函数来处理迭代。
    猜你喜欢
    • 2011-12-28
    • 2019-12-24
    • 2014-05-30
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2018-04-08
    相关资源
    最近更新 更多