簡體   English   中英

錯誤:不支持的操作數類型

[英]Error: Unsupported Operand Types

我試圖使用遞歸來返回兩個列表的點積,並且試圖解決以下情況:得到兩個長度不同的列表:返回0。但是,當我嘗試檢查該條件時,出現錯誤:&的不支持的操作數類型:“列表”和“列表”。 為什么我不能在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])

我可能會做這樣的事情:

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;
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])

如果您檢出python的運算符優先級 ,則會看到&優先級低於== 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])

但是,如果您想使用& (這是Binary 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]))

您的代碼比實際需要的要復雜一些。 不可能取兩個大小不相同的向量的點積。 有兩種方法可以處理不同大小的接收向量。

1)從較大的向量中刪除剩余的未使用的數字。 以下是您的函數的修改版本。 我將其更改為僅需要檢查兩個向量是否為空(無需以多種方式進行檢查),並將其更改為從向量的開頭而不是結尾開始。 從頭開始有什么特殊的原因嗎?

def dot(L, K):
    if(L == [] or K == []):
        return 0
    else:
        return L[0] + K[0] + dot(L[1:], K[1:])

盡管此選項有效,但它不會向用戶提供任何征兆,表明他們在嘗試對兩個不同大小的向量進行點積時出錯。

2)在收到兩個不同大小的向量時給用戶一個錯誤。

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:])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM