错误:不支持的操作数类型

时间:2016-09-11 03:23:42

标签: python math

我正在尝试使用递归来返回两个列表的点积,并且我正在尝试解释我得到两个不同长度的列表的情况:我返回0.但是,当我尝试检查对于那个条件,我得到错误:&:'list'和'list'的不支持的操作数类型。为什么我不能使用'&' Python中两个列表的操作数?

def dot(L, K):
    if L+K == []:
        return 0
    elif L == [] & K != []:
        return 0
    elif K == [] & L != []:
        return 0 
    else:
        return L[-1] * K[-1] + dot(L[:-1], K[:-1])

4 个答案:

答案 0 :(得分:1)

我可能会这样做:

def dot(L, K):
    if L + K == [] or len(L) != len(K): # this only needs to be checked once
        return 0
    return dot_recurse(L, K)

 def dot_recurse(L, K):
     if len(L) > 0:
         return L[-1] * K[-1] + dot_recurse(L[:-1], K[:-1])
     else:
         return 0;

答案 1 :(得分:0)

def dot(L, K):
    if len(L)!=len(K):  # return 0 before the first recursion
        return 0
    elif not L:  # test if L is [] - previous test implies K is [] so no need to retest
        return 0
    else:
        return L[-1] * K[-1] + dot(L[:-1], K[:-1])

答案 2 :(得分:0)

如果你查看了python的Operator Precedence,你会发现&的优先级低于==and

这意味着您正在执行以下操作:

if (L == ([] & K)) != []:
    ...

根据Tuan333的建议,您应该使用and

def dot(L, K):
    if L+K == []:
        return 0
    elif L == [] and K != []:
        return 0
    elif K == [] and L != []:
        return 0 
    else:
        return L[-1] * K[-1] + dot(L[:-1], K[:-1])

但是,如果您想使用&二进制AND ,并且不是一回事),您可以使用()来强制优先

def dot(L, K):
    if L+K == []:
        return 0
    elif (L == []) & (K != []):
        return 0
    elif (K == []) & (L != []):
        return 0 
    else:
        return L[-1] * K[-1] + dot(L[:-1], K[:-1])

如果您很好奇为什么&可能不是您想要阅读的内容:

  • AND获取两个值,将其转换为布尔值(TrueFalse)并检查两者是否为True
  • 二进制AND &)接受两个值,将它们转换为类似数字的值,然后对其位执行操作

以下是我将如何实现此功能

def dot(L, K):
    if len(L) != len(K):
        # Ensure the lists are the same length
        raise ValueError('Can not perform dot product on two differently sized lists')
    elif len(L) + len(K) == 0:
        # See if we've reached the base case
        return 0
    else:
        # Recurse doing dot product
        return L[-1] * K[-1] + dot(L[:-1], K[:-1])


print(dot([6, 2, 6], [5, 1]))

答案 3 :(得分:0)

您的代码比实际需要的要复杂一些。不可能采用两个不同尺寸的矢量的点积。有几种方法可以处理接收不同大小的矢量。

1)从较大的矢量中删除剩余的未使用的数字。以下是您的功能的修改版本。我将其更改为只需要检查其中一个向量是否为空(不需要以多种方式检查),并将其更改为从向量的开头而不是结束开始。你有没有特别的理由从最后开始?

def dot(L, K):
    if(len(L) != len(K)):
        print('Vector sizes do not match, please pass two same-sized vectors')
        return 0 #not sure exactly how you are wanting to do error handling here.
    elif(L == [] or K == []):
        return 0
    else:
        return L[0] + K[0] + dot(L[1:], K[1:])

虽然此选项有效,但它并未向用户提供任何迹象表明他们在尝试点击两个不同大小的矢量时产生错误。

2)收到两个不同大小的矢量后,给用户一个错误。

{{1}}