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

Python 使用递归在列表列表中查找元素,python,arrays,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” 我应该打印一次“耶”。相反,我得到了以下结果: Traceback (most recent call last): File "finder.py", li

给定以下数组

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”


我应该打印一次
“耶”
。相反,我得到了以下结果:

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()
回溯(最近一次呼叫最后一次):
文件“finder.py”,第37行,在
f(2,l)
文件“finder.py”,第35行,在f中
返回f(元素,lst[0][1:])
文件“finder.py”,第30行,在f中
如果len(lst[0])==0:
TypeError:类型为“int”的对象没有len()
通常,您可以获取子列表的
len()
,但在检查函数内部的情况下则不行。

如何使用递归检查2D列表中的元素?

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

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

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

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]]
执行此操作时:

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]
执行此操作时:

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
的作业后,因为您似乎复制了错误的作业):

这导致:

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()

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

在调试时,我通常发现打印出值以查看它们出错的位置非常有用。在这种情况下(在修复
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()

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

@KenY-N:即使这样,它也不起作用,并且会出现同样的错误。我不确定这个实现到底想做什么(也许解释一下它背后的思想?)-但我真的想不出一个使用递归的好方法。(数据结构只有两个级别,其中只有一个级别可以实际包含值0。)我可能只是在循环中执行此操作。我认为如果isinstance(lst,list):需要返回0。还请注意,我们希望实际的代码被发布,所以请更正声明。编辑,现在是)@KenY-N:即使这样,它也不起作用,并给出相同的错误。我不确定这个实现真正想做什么(也许解释它背后的思想?)-但我真的想不出一个使用递归的好方法。(数据结构只有两个级别,其中只有一个级别可以实际包含值0。)我可能只是在循环中执行此操作。我认为如果isinstance(lst,list):需要返回0。还请注意,我们期望实际代码被发布,因此请更正声明。已编辑,现在是),但调用堆栈指示错误发生在一级递归之后,OP指出了它们的错误。但调用堆栈指示错误发生在一级递归之后,OP指出了它们的错误。