【问题标题】:How to iterate over a 2D matrix in Python?如何在 Python 中迭代二维矩阵?
【发布时间】:2023-12-03 10:46:01
【问题描述】:

我在思考如何设置迭代代码时遇到了麻烦,我将矩阵构建为列表列表

for _ in range(rowsLen):
    self.matrixRC.append([2 for _ in range(collsLen)])

使用我目前拥有的迭代代码,它会以错误的方式进行迭代。

def __iter__(self): 
    for i in self.matrixRC:
        for j in i:
            yield j


def __next__(self): 
    for i in self.matrixRC:
        for j in i:
            return j

以错误的方式迭代我的意思是它首先向我显示matrixRC[0][0] 然后matrixRC[0][1] 等的值,但我希望它显示matrixRC[0][0] 然后matrixRC[1][0]

或者,如果它已经显示matrixRC[0][0],然后是matrixRC[1][0],那么我希望它显示matrixRC[0][0],然后是matrixRC[0][1]。我真的很难想象这个迭代代码是如何工作的(我复制的少数代码部分之一)。

【问题讨论】:

  • 能否提供样例输入输出?

标签: python iteration next


【解决方案1】:
def __iter__(self): 
       for i in zip(*self.matrixRC):
            for j in i:
                yield j

    def __next__(self): 
        for i in zip(*self.matrixRC):
            for j in i:
                return j

【讨论】:

  • 如果维度是 N x M 其中 N != M 怎么办?
  • 如果您没有任何行/列怎么办?我认为我们应该等待来自 OP 的更多意见 :)
  • 谢谢!我仍然没有得到迭代,但我想我会在另一次弄清楚。
  • 感谢@JayShankarGupta IDK zip,但看起来它可以工作 xD
【解决方案2】:

这应该可行:

def __iter__(self): 
       yield from chain.from_iterable(zip(*(self.matrixRC or [])))

def __next__(self):
    return next(iter(self))

【讨论】:

  • 我不认为一切都必须是一行:)
  • 我在这个答案的作者面前鞠躬。
最近更新 更多