给出以下数组,
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()
,但是如果您在函数内部进行检查,则无法获得该列表。
答案 0 :(得分:1)
执行此操作时:
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]
答案 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]]