我是python的新手,正在接受artificial intelligence course on MIT OpenCourseWare。我正在做lab0任务," Expression Depth"问题可供参考。
当我运行我的代码时,它不会将item
中的第一个expr
作为列表,即使它是,因此返回值比预期的少1。
代码:
def depth(expr):
d = 0
for item in expr:
print isinstance(item, (tuple, list))
if isinstance(item, (tuple, list)):
lvl = 1 + depth(item)
if lvl >= d:
d = lvl
return d
使用此参数运行测试:
def depth_2_getargs():
return [['expt', 'x', 2]]
这里的答案应该是d = 1
,但这是我的输出:
False
False
False
Test 10/23: Incorrect.
depth_2
Got: 0
Expected: 1
所以我个人的解释是,isinstance(item, (tuple, list))
没有看到expr
中的第一个元素作为列表,而item
似乎已经占据了子列表中的第一个元素。输出应为
True
False
False
False
右?初始True
来自提供的列表;三个False
行来自列表元素的迭代。
为什么会发生这种情况,我该如何解决这个问题?
编辑:为了澄清并拯救他人的麻烦,作业说明:
depth('x') => 0
depth(('expt', 'x', 2)) => 1
depth(('+', ('expt', 'x', 2), ('expt', 'y', 2))) => 2
depth(('/', ('expt', 'x', 5), ('expt', ('-', ('expt', 'x', 2), 1), ('/', 5, 2)))) => 4
答案 0 :(得分:2)
看看你的代码:
def depth(expr):
d = 0
for item in expr:
你假设给定的参数是某种类型的可迭代(隐含在for
语句中),并且你将该序列的默认深度指定为0.你得到了什么你编程了。如果列表的初始深度为1,则从1开始d
,而不是0。
否则,您可以测试expr
以查看它是否为列表/元组;如果没有,返回0;如果是这样,从1开始d
并循环遍历元素(当前循环逻辑)。
这是否会消除您的基本情况的歧义?
尝试这个例程的介绍:
def depth(expr):
if isinstance(item, (tuple, list)):
d = 1
for item in expr:
lvl = 1 + depth(item)
if lvl >= d:
d = lvl
else:
d = 0
return d
这将基本情况推迟到接收标量(或字符串等), 的深度为0.它还为空列表的深度返回1(没有要通过迭代的项目。
答案 1 :(得分:1)
也许当他们写回[['expt', 'x', 2]]
时,他们返回一个传递给你的函数的所有参数的列表,在这种情况下,它只是1,所以他们打算传递的参数是['expt', 'x', 2]
而不是['expt', 'x', 2]
实际上输出对我来说似乎很好:
lorenzo@pc:~$ python
Python 2.7.6 (default, Oct 26 2016, 20:30:19)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def depth(expr):
... d = 0
... for item in expr:
... print isinstance(item, (tuple, list))
... if isinstance(item, (tuple, list)):
... lvl = 1 + depth(item)
... if lvl >= d:
... d = lvl
... return d
...
>>> depth([['expt', 'x', 2]])
True
False
False
False
1
我怀疑你是用depth(['expt', 'x', 2])
来表示
>>> depth(['expt', 'x', 2])
False
False
False
0
答案 2 :(得分:1)
查看作业和tests.py
文件后,我很确定它正在调用你的函数
apply(depth, depth_2_getargs())
而不是将depth_2_getargs()
的结果作为单个参数传递。这就是为什么它被称为getargs
而不是getarg
。 (apply
是执行*
和**
参数的旧方式。)
分配表明像['x']
这样的输入应该产生1而不是0的结果。你的结果是一个结果。此外,您没有处理输入不是列表或元组的情况。