【问题标题】:__str__ from my own matrix, python__str__ 来自我自己的矩阵 python
【发布时间】:2018-04-01 07:57:25
【问题描述】:

我正在制作自己的矩阵模块(我知道 numpy 存在),但我不太确定如何构建我的 __str__。我的矩阵是这样的

for _ in range(rows):
        self.matrixRC.append([2 for _ in range(colls)])

在这里我用int 2 填充我的矩阵。如果我们只是说rows = 5calls = 3,那么当我打印它时就会得到这个

[[2, 2, 2],[2, 2, 2],[2, 2, 2],[2, 2, 2],[2, 2, 2]]

但我想得到

222
222
222
222
222

有没有人知道一个简单的“Python”方法来做到这一点

这实际上是__init__ 中唯一的部分

def __init__(self, rows = 10, colls = 10):
    self.matrixRC = []
    for _ in range(rows):
        self.matrixRC.append([2 for _ in range(colls)])

对于rows colls 的事情......这只是奇怪的想法,我仍然无法考虑这个任意矩阵。但是现在rows and colls 应该做对了。如果像这样制作__init__ 更容易

def __init__(self, rows = 10, colls = 10):
    self.matrixRC = []
    for _ in range(colls):
        self.matrixRC.append([2 for _ in range(rows)])

那也很好

【问题讨论】:

  • 你能把matrixRC类的代码贴出来吗?
  • 确实有一个简单的方法,你的类代码会很有帮助。
  • 为什么不想要行项目之间的分隔符?它们会一直是个位数吗?

标签: python string class matrix


【解决方案1】:

您可以使用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

如果你决定确实在行项之间需要一个分隔符,只需修改内部.join的字符串,例如

'\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 方法传递给列表实际上比生成器更有效。因此,__str__ 方法的 Pythonic 版本是:

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)

【讨论】:

  • 所以你的fill 是我的__init__ 的简单版本,而你的__str__ 将行与'/n' 连接起来,然后将这些行中的项目连接起来,对吗?
  • @BrendanMesters 在您发布 __init__ 代码之前,我在等待您回复我的 cmets 时编写了该代码,但是是的,它与您的代码基本相同。是的,我的__str__ 将行与'\n' 连接起来,并将这些行中的项目与空字符串连接起来。
  • @BrendanMesters 我们可以安全地使用[val] * cols 来创建每一行,因为val 是一个int,它是不可变的。如果val 是一个可变对象(例如一个列表),那将是不安全的,因为[val] * cols 会创建一个包含cols 对同一val 对象的引用的列表。
  • 可能值得一提:(map(str, row)) 等价于(str(x) for x in row)。 IMO 稍长的版本更易于阅读。
  • @ArthurTacca 公平点。我已经更新了我的答案。 FWIW,我最近一直在使用map,所以我现在发现它比更长的版本更具可读性。 ;)
猜你喜欢
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多