[英]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
接受兩個值,將它們轉換為布爾值( True
或False
),然后檢查兩個值是否均為True
&
)取兩個值,將它們轉換為類似數字的值,然后對它們的位執行運算 這是我將如何實現此功能的方法
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.