__str__;来自我自己的矩阵python
我正在制作自己的矩阵模块(我知道numpy是存在的),但我不太确定如何构建我的__str__;来自我自己的矩阵python,python,string,class,matrix,Python,String,Class,Matrix,我正在制作自己的矩阵模块(我知道numpy是存在的),但我不太确定如何构建我的\uu str\uu。我的矩阵是这样的 for _ in range(rows): self.matrixRC.append([2 for _ in range(colls)]) def __init__(self, rows = 10, colls = 10): self.matrixRC = [] for _ in range(colls): self.matrix
\uu str\uu
。我的矩阵是这样的
for _ in range(rows):
self.matrixRC.append([2 for _ in range(colls)])
def __init__(self, rows = 10, colls = 10):
self.matrixRC = []
for _ in range(colls):
self.matrixRC.append([2 for _ in range(rows)])
这里我用int
2填充我的矩阵。如果我们只说rows=5
和calls=3
,那么当我打印它时就会得到这个值
[[2, 2, 2],[2, 2, 2],[2, 2, 2],[2, 2, 2],[2, 2, 2]]
但是我想
222
222
222
222
222
有人知道一种简单的“Python”方法来实现这一点吗
这是\uuuu init\uuuuu
def __init__(self, rows = 10, colls = 10):
self.matrixRC = []
for _ in range(rows):
self.matrixRC.append([2 for _ in range(colls)])
对于行coll
的事情。。。这只是一个奇怪的想法,我仍然很难想到这个任意矩阵。但是现在应该正确处理行和列。如果更容易使\uuuu init\uuuu
像这样
for _ in range(rows):
self.matrixRC.append([2 for _ in range(colls)])
def __init__(self, rows = 10, colls = 10):
self.matrixRC = []
for _ in range(colls):
self.matrixRC.append([2 for _ in range(rows)])
这也很好您可以使用str.join
方法来实现。内部循环将行项目转换为字符串,并将其与作为分隔符的空字符串连接,外部循环将行字符串与换行符连接
class Test:
def fill(self, rows, cols, val):
self.matrixRC = [[val] * cols for _ in range(rows)]
def __str__(self):
return '\n'.join(''.join(map(str, row)) for row in self.matrixRC)
t = Test()
t.fill(5, 3, 2)
print(t)
输出
222
222
222
222
222
如果您决定行项目之间确实需要分隔符,只需修改内部的字符串
'\n'.join(' | '.join(map(str, row)) for row in self.matrixRC)
给我们
2 | 2 | 2
2 | 2 | 2
2 | 2 | 2
2 | 2 | 2
2 | 2 | 2
有些人,包括Guido,不喜欢map
函数。实际上,将.join
方法传递给列表比传递给生成器更有效。因此,该\uuuu str\uuu
方法的一个更具python风格的版本是:
def __str__(self):
return '\n'.join([''.join([str(u) for u in row]) for row in self.matrixRC])
我们还可以通过分离两个循环使代码更具可读性:
def __str__(self):
out = []
for row in self.matrixRC:
out.append(''.join([str(u) for u in row]))
return '\n'.join(out)
你能发布matrixRC类的代码吗?确实有一个简单的方法,你的类代码会很有帮助。为什么不在行项目之间使用分隔符呢?它们总是一位数字吗?那么你的填充
是我的\uuuu init\uuuu
的一个简单版本,你的\uu str\uuuuu
将行与'/n'
连接,并将这些行中的项目连接起来,但没有任何正确的地方?@BrendanMesters我在等待你回复我的评论时编写了这段代码,在您发布\uuuu init\uuuu
代码之前,是的,它与您的代码基本相同。是的,我的\uu str\uu
用'\n'
连接行,并用空字符串连接这些行中的项目。@BrendanMesters我们可以安全地使用[val]*cols
生成每一行,因为val
是一个int
,它是不可变的。如果val
是一个可变对象(例如列表),那就不安全了,因为[val]*cols
生成一个列表,其中包含对同一val
对象的引用。可能值得一提的是:(map(str,row))
相当于(str(x)表示行中的x)
。在我看来,稍长一点的版本更容易阅读。@Arthurtaca公平点。我已经更新了我的答案。FWIW,我最近一直在使用map
,所以我现在发现它比较长的版本更可读