“NoneType”对象没有属性getitem和python booleans

时间:2015-12-27 18:20:57

标签: python

编辑:我通过编辑有问题的行来绕过问题:

if ( type(x) == int or ( type(x)==list and type(x[0]) == int ) ) and not ( type(y) == int or (type(y)==list and type(y[0])  == int) ):

因此,在我的部分代码中,我试图将矩阵,整数或列表浮点表示的组合相乘(例如[5,9] = 5/9)。但是我得到了上面提到的错误。

我的逻辑是btw,如果X(或Y)不是矩阵,这意味着它是一个整数,或者它是[a,b]类的列表,这意味着它的第一个元素也是一个整数,在矩阵中,它是[[a,b],[c,d]],这意味着X的第一个元素也是一个列表。

以下是代码:

def matmult(X,Y):
    #X integer Y matrix
    if ( type(X) == int or type(X[0]) == int ) and not ( type(Y) == int or type(Y[0])  == int ):

        for i in range(len(Y)):
            for j in range(len(Y[i])):
                Y[i][j] = multit(Y[i][j],X)
        return Y
    #Y integer X matrix
    elif ( type(y) == int or type(Y[0])  == int ) and not (type(X) == int or type(X[0]) == int) :

        for i in range(len(X)):
            for j in range(len(X[i])):
                X[i][j] = multit(X[i][j],Y)
        return X
    #both integer
    elif ( type(X) == int or type(X[0]) == int ) and ( type(y) == int or type(Y[0])  == int ):

        return multit(X,Y)
    #both matrix
    else:

        #defining the result matrix
        result = [ [ [] for bim in xrange(len(Y)) ] for bom in xrange( len(X[0]) ) ]
        for i in range(len(result)):
            for j in range(len(result[0])):
                result[i][j] = 0
        #multiplating it    
        for i in range(len(X)):

            for j in range(len(Y[0])):

                for k in range(len(Y)):
                    result[i][j] = sumit( result[i][j], multit(X[i][k],Y[k][j]) )
        return result

我收到该行的错误:

if ( type(X) == int or type(X[0]) == int ) and not ( type(Y) == int or type(Y[0]) == int )

但是我也会将其用于其他案件。 我对这个问题的看法是,当X可能不是一个列表时,我可能会调用X [0],但是如果是这样的话我很难并且X是整数python不会检查另一个案例,因为它会停在“类型” (X)== int“。

这就是我怎么称为matmul,我应该以btw的前缀方式获取矩阵运算。

if lst[0]=="+":
    return reduce(matsum,lst[1:])
elif lst[0]=="-":
    return matsub(lst[1],lst[2])
elif lst[0]=="*":
    return reduce(matmult,lst[1:])

完整追溯:

Traceback (most recent call last):
  File "mateval.py", line 161, in <module>
    print mateval(["+",["*",["-",1,[1,3]],[[2,[-1,2]],[[7,3],525]],[[7,3],[1,5],-9,23]]]],[[2,3,-1],[[1,2],[1,3],-1]]])
  File "mateval.py", line 150, in mateval
    lst[i] = mateval(lst[i])
  File "mateval.py", line 157, in mateval
    return reduce(matmult,lst[1:])
  File "mateval.py", line 108, in matmult
    if ( type(x) == int or type(x[0]) == int ) and not ( type(y[0])  == int ):
TypeError: 'NoneType' object has no attribute '__getitem__'

1 个答案:

答案 0 :(得分:0)

您发布的代码与回溯中显示的代码不同。但是,我怀疑matmul以某种方式返回None,这会导致异常。也许,你忘记了return陈述吗?

请注意,multit可能是罪魁祸首。