使用递归在列表列表中查找元素

时间:2018-12-19 23:50:47

标签: python arrays

给出以下数组,

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列表中的元素?

3 个答案:

答案 0 :(得分:1)

执行此操作时:

return f(element,lst[0][1:])

lst[0][1:]将您的列表列表缩小为一个列表。您会得到:

[0, 0, 0, 0]

这就是len(lst[0])失败的原因,因为lst[0] = 0int,因此您无法从其中获得len()

您必须重新考虑您的流程。

第二部分:

您要寻找的东西最终将以一种非常丑陋的方式结束。请记住,您必须浏览阵列的两侧。与递归不同,嵌套循环可以很好地处理该问题。

Python提供了更轻松的方法来完成您想要的事情,例如:

[print('yay') for i in l for j in i if j == element]

答案 1 :(得分:1)

在调试时,我通常发现打印出值以查看它们在哪里出错很有帮助。在这种情况下(固定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:上的错误是因为您试图将{0}放在列表的第0位(即数字)上的任何对象作为对象。

作为一个例子,这几乎就是正在发生的事情:

len()

@slybloty的答案是为什么您只得到一个列表。

答案 2 :(得分:0)

您的列表声明实际上只创建一个整数列表。

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