簡體   English   中英

使用遞歸在列表列表中查找元素

[英]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() ,但如果要在函數內部進行檢查,則無法獲取。


如何使用遞歸檢查2D列表中的元素?

執行此操作時:

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.

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