列表上的任意操作

时间:2010-12-31 09:36:47

标签: python list

["add",["subtract",["multiply",2,["add",1,3]], 4 ] , 5 ]

我该怎么做这些操作

当编程看到“添加”时,它会添加1和3并返回4个新列表

["add",["subtract",["multiply",2, 4 ], 4 ] , 5 ]

当编程看到“乘法”它确实2 * 4并且返回8个新列表变为

["add",["subtract",8, 4 ] , 5 ]

一次递归后

["add",4 , 5 ]

在最后一次递归之后

return 9

3 个答案:

答案 0 :(得分:1)

您应该编写一个遍历列表并执行操作的递归函数。

这实际上是相当微不足道的,但我不想只给你答案,特别是因为它听起来像是家庭作业。 :)所以用你想做的事情更新你的问题,我们会告诉你哪里出错了。

答案 1 :(得分:1)

import operator

def do_math(op):
    try:
        return getattr(operator, op[0][:3])(*[do_math(arg) for arg in op[1:]])
    except TypeError:
        return op

L = ["add",["subtract",["multiply",2,["add",1,3]], 4 ] , 5 ]
print do_math(L)

答案 2 :(得分:0)

要做的第一件事就是将它作为树直观地绘制出来:

alt text

如果你看左边的孩子(减去,乘以/ 4等)你会看到它也是一棵树;左半部分(乘法,2 /加等)。

实际上,您可以将每个节点的后代视为树,包括(a)运算符,左子树和右子树,或(b)值(叶节点) ,没有更多的后代)。

to evaluate a tree:
  if it is a value:
    you have the final value; return it
  otherwise, it is an operator:
    evaluate the left sub-tree
    evaluate the right sub-tree
    do operation(left-tree-value, right-tree-value)
    return the result

您会注意到'evaluate tree'调用自身来操作子树 - 这是递归,解决问题取决于解决同一问题的较小版本然后组合结果。

所以最终的评估顺序如下:

what is tree value?
    add: {tree1} + {tree2}
    what is tree1?
        subtract: {tree3} - {tree4}
        what is tree3?
            multiply: {tree5} * {tree6}
            what is tree5?
            2
            what is tree6?
                add: {tree7} + {tree8}
                what is tree7?
                1
                what is tree8?
                3
                add: 1 + 3
            4
            multiply: 2 * 4
        8
        what is tree4?
        4
        subtract: 8 - 4
    4
    what is tree2?
    5
    add: 4 + 5
9