列表中缀@的实现
Implementation of infix @ for lists
PEP 465 为矩阵乘法添加@中缀运算符。然而,这些列表目前还没有实现这一点。因此,按照文档的指示,我尝试实现我自己的 __matmul__
版本。
这是我的第一次尝试。
class Matrices(list):
def __matmul__(self,matrix):
tempmat = [[0 for row in range(len(self))] for col in range(len(matrix))]
for i in range(len(self)):
for j in range(len(matrix[0])):
for k in range(len(matrix)):
tempmat[i][j] += self[i][k] * matrix[k][j]
return tempmat
a = Matrices()
a.append([[1,2],[3,4]])
b = Matrices()
b.append([[5,6],[7,8]])
print(a@b)
但是我收到一个错误,
Traceback (most recent call last):
File "test.py", line 14, in <module>
print(a@b)
File "test.py", line 7, in __matmul__
tempmat[i][j] += self[i][k] * matrix[k][j]
TypeError: can't multiply sequence by non-int of type 'list'
如何解决这个问题?也就是说,如何为 python 中的列表实现 @
字符?
已更新重写问题:显然,self[i][k]
或 matrix[k][j]
是 list
,而不是 int
。看起来你 append
在你应该 extend
ing 的时候在外面的代码中。
第一个问题的原始答案:
您使用了 [[0 for row in range(self)] for col in range(matrix)]
,而您可能打算将 self
和 matrix
都包装在 len
调用中。除非出于某些疯狂的原因,您在 Matrices
class 上实现了 __index__
,否则它不是整数,因此您不能 range
超过它。
PEP 465 为矩阵乘法添加@中缀运算符。然而,这些列表目前还没有实现这一点。因此,按照文档的指示,我尝试实现我自己的 __matmul__
版本。
这是我的第一次尝试。
class Matrices(list):
def __matmul__(self,matrix):
tempmat = [[0 for row in range(len(self))] for col in range(len(matrix))]
for i in range(len(self)):
for j in range(len(matrix[0])):
for k in range(len(matrix)):
tempmat[i][j] += self[i][k] * matrix[k][j]
return tempmat
a = Matrices()
a.append([[1,2],[3,4]])
b = Matrices()
b.append([[5,6],[7,8]])
print(a@b)
但是我收到一个错误,
Traceback (most recent call last):
File "test.py", line 14, in <module>
print(a@b)
File "test.py", line 7, in __matmul__
tempmat[i][j] += self[i][k] * matrix[k][j]
TypeError: can't multiply sequence by non-int of type 'list'
如何解决这个问题?也就是说,如何为 python 中的列表实现 @
字符?
已更新重写问题:显然,self[i][k]
或 matrix[k][j]
是 list
,而不是 int
。看起来你 append
在你应该 extend
ing 的时候在外面的代码中。
第一个问题的原始答案:
您使用了 [[0 for row in range(self)] for col in range(matrix)]
,而您可能打算将 self
和 matrix
都包装在 len
调用中。除非出于某些疯狂的原因,您在 Matrices
class 上实现了 __index__
,否则它不是整数,因此您不能 range
超过它。