[英]Finding an element in a list of lists using recursion
給定以下數組,
l = [
[0, 0, 0, 0, 0],
[0, 2, 1, 1, 0],
[0, 1, 0, 0, 0],
[0, 1, 1, 3, 0],
[0, 0, 0, 0, 0]
]
要求我定義一個遞歸函數,每次在此2D數組中找到某個元素時,該函數就會輸出"yay"
。
def f(element, lst):
if not lst:
return 0
if len(lst[0])==0:
return f(element,lst[1:])
if lst[0][0]==2:
print("yay")
return f(element,lst[0][1:])
return f(element, lst[0][1:])
f(2, l)
我應該得到"yay"
打印一次。 相反,我得到以下內容:
Traceback (most recent call last):
File "finder.py", line 37, in <module>
f(2, l)
File "finder.py", line 35, in f
return f(element, lst[0][1:])
File "finder.py", line 30, in f
if len(lst[0])==0:
TypeError: object of type 'int' has no len()
通常,您可以獲取子列表的len()
,但如果要在函數內部進行檢查,則無法獲取。
執行此操作時:
return f(element,lst[0][1:])
lst[0][1:]
將您的列表列表切成一個列表。 你得到:
[0, 0, 0, 0]
這就是len(lst[0])
失敗的原因,因為lst[0] = 0
(一個int
,因此您無法從中獲取len()
。
您必須重新考慮您的過程。
您要尋找的東西最終將以一種非常丑陋的方式結束。 請記住,您必須瀏覽陣列的兩側。 與遞歸不同,嵌套循環可以很好地處理該問題。
Python提供了更輕松的方法來完成您想要的事情,例如:
[print('yay') for i in l for j in i if j == element]
調試時,通常會發現打印出值以查看錯誤出處非常有幫助。 在這種情況下(固定了l
的分配后,因為您似乎復制錯了):
l = [[0, 0, 0, 0, 0],
[0, 2, 1, 1, 0],
[0, 1, 0, 0, 0],
[0, 1, 1, 3, 0],
[0, 0, 0, 0, 0]]
def f(element, lst):
print("Element: " + str(element))
print("List: " + str(lst))
if not lst:
return 0
if len(lst[0])==0:
return f(element,lst[1:])
if lst[0][0]==2:
print("yay")
return f(element,lst[0][1:])
return f(element, lst[0][1:])
f(2, l)
這導致:
Element: 2
List: [[0, 0, 0, 0, 0], [0, 2, 1, 1, 0], [0, 1, 0, 0, 0], [0, 1, 1, 3, 0], [0, 0, 0, 0, 0]]
Element: 2
List: [0, 0, 0, 0]
Traceback (most recent call last):
File "test.py", line 20, in <module>
f(2, l)
File "test.py", line 18, in f
return f(element, lst[0][1:])
File "test.py", line 13, in f
if len(lst[0])==0:
TypeError: object of type 'int' has no len()
if len(lst[0])==0:
,這行就出錯了if len(lst[0])==0:
因為您正嘗試獲取列表第0位len()
中任何對象的len()
。
例如,這幾乎是正在發生的事情:
>>> len(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()
@slybloty的答案是為什么您只得到一個列表。
列表的聲明實際上僅創建一個整數列表。
l = [0, 0, 0, 0, 0]
[0, 2, 1, 1, 0]
[0, 1, 0, 0, 0]
[0, 1, 1, 3, 0]
[0, 0, 0, 0, 0]
Python將l
分配給[0, 0, 0, 0, 0]
,而不關心接下來的4行。 因此,此行:
if len(lst[0])==0:
嘗試找到長度為l[0]
的整數。
只需將您對l
的聲明更改為:
l = [[0, 0, 0, 0, 0],
[0, 2, 1, 1, 0],
[0, 1, 0, 0, 0],
[0, 1, 1, 3, 0],
[0, 0, 0, 0, 0]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.