infix @ for lists的实现

时间:2015-12-21 14:51:49

标签: python python-3.5

PEP 465添加@interix运算符进行矩阵乘法。然而,这些列表目前尚未实现此目的。因此,在文档的指导下,我尝试实现自己的__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中为列表实现@字符?

1 个答案:

答案 0 :(得分:2)

针对重写问题进行了更新:显然,self[i][k]matrix[k][j]list,而不是int。您应该append时看起来像是extend在外面的代码中。

第一个问题的原始答案

您可能想要在[[0 for row in range(self)] for col in range(matrix)]次来电中包含selfmatrix时使用len。除非出于某种疯狂的原因,您在__index__课程中实施了Matrices,否则它不是整数,因此您无法range覆盖它。