Python迭代矩阵类
Posted
技术标签:
【中文标题】Python迭代矩阵类【英文标题】:Python iterating over matrix class 【发布时间】:2017-01-30 07:33:08 【问题描述】:from collections.abc import Sequence
class Map(Sequence):
""" Represents a map for a floor as a matrix """
def __init__(self, matrix):
""" Takes a map as a matrix """
self.matrix = matrix
self.height = len(matrix)
self.width = len(matrix[0])
super().__init__()
def __getitem__(self, item):
""" Needed by Sequence """
return self.matrix[item]
def __len__(self):
""" Needed by Sequence """
return len(self.matrix)
def search(self, entity):
""" Returns a generator of tuples that contain the x and y for every element in the map that matches 'entity' """
for row in range(self.height):
for column in range(self.width):
if matrix[row][column] == entity:
yield (row, column)
# Examples
gmap = Map([[0, 0, 0],
[0, 1, 0],
[0, 0, 0]])
for entity in gmap:
print(entity)
我怎样才能实现__iter__
这样
for entity in gmap:
print(entity)
产生0 0 0 0 1 0 0 0 0
而不是
[0, 0, 0]
[0, 1, 0]
[0, 0, 0]
这将使我无需继承 Sequence
,并使 search()
的代码更整洁
此外,我应该使用他们的任何其他魔术方法吗? (除了__str__
,我在迭代工作后会这样做)
【问题讨论】:
这真是个坏主意。这会使您的__iter__
和__getitem__
彼此不一致。
另外,它实际上不会让search
更整洁。
【参考方案1】:
你可以像这样实现__iter__()
:
from itertools import chain
def __iter__(self):
return chain.from_iterable(self.matrix)
itertools.chain.from_iterable()
接受一个可迭代的迭代并将它们组合在一起。它创建了一个生成器,因此不会使用额外的内存。
【讨论】:
谢谢!我实际上尝试过这个,但我才意识到我搞砸了如何导入它 @Lord_Zane55 顺便说一句,矩阵不一定是“行序列”...__getitem__
返回一行相当有趣。这不是很直观。
我发现sn-p在线进行迭代,你能解释一下矩阵不是“行序列”以及__getitem__
应该做什么以备将来使用吗?
@Bharel: __getitem__
返回一行是非常普通的。否则你会让some_matrix[2][3]
工作吗?
我的意思是,矩阵根本不是一个序列。矩阵的长度是多少?行数?你不觉得 1 行 9001 列的矩阵的 length 为 1 很有趣吗?它有宽度和高度,而不是长度......确实,需要__getitem__
。 Sequence
的继承让我好奇。您可能会争辩说,因此长度是width * height
,但是__getitem__
与长度结合起来毫无意义。尝试获取第 9001 项(毕竟这是长度)会失败。以上是关于Python迭代矩阵类的主要内容,如果未能解决你的问题,请参考以下文章