计算表达式深度的一个错误

时间:2017-05-31 16:30:48

标签: python

我是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

3 个答案:

答案 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的结果。你的结果是一个结果。此外,您没有处理输入不是列表或元组的情况。