评估括号内的表达式

时间:2018-11-18 12:01:19

标签: python list

要求我定义一个采用以下格式的列表的函数:

  • [2, "+", 5], 3, 5]

并返回带有评估表达式(例如此表达式)的列表

  • [7, 3, 5]

这是我的代码:

def evalExpr(lst):
    """
    parameters : lst of type lst:
    returns : evaluation of the expression inside brackets;
    """
    for i in lst:
        if len(lst[i]) == 3:
            for j in lst[i]:
                if lst[i][j]== "+":
                    lst[i] = lst[i][j-1] + lst[i][j+1]
    return lst

print(evalExpr([[2, "+", 5], 3, 5]))

这是我得到的错误:

<ipython-input-1-5c5345233e02> in evalExpr(lst)
      5     """
      6     for i in lst:
----> 7         if len(lst[i]) == 3:
      8             for j in lst[i]:
      9                 if lst[i][j]== "+":

TypeError: list indices must be integers or slices, not list

我应该怎么做才能获得正确的输出?

1 个答案:

答案 0 :(得分:0)

当我运行您的代码时,这是我的例外情况:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-1d51996f7143> in <module>
----> 1 evalExpr([[2, "+", 5], 3, 5])

<ipython-input-1-5c5345233e02> in evalExpr(lst)
      5     """
      6     for i in lst:
----> 7         if len(lst[i]) == 3:
      8             for j in lst[i]:
      9                 if lst[i][j]== "+":

TypeError: list indices must be integers or slices, not list

突出显示的行显示i不是整数(它可能是列表对象),并且您正在尝试将其用作索引。如果需要索引,则需要在for循环中使用Python enumerate函数。然后,您将能够在每次迭代中同时使用索引和当前值。

以下是如何使用此有用的Python函数的示例:

def evalExpr(lst):
    """
    parameters : lst of type lst:
    returns : evaluation of the expression inside brackets;
    """
    for i, e in enumerate(lst): # i is the index and e the actual element in the iteration
        if isinstance(e, list) and len(e) == 3:
            lst[i] = eval(str(lst[i][0]) + lst[i][1] + str(lst[i][2]))
    return lst

new_list = evalExpr([[2, "+", 5], 3, 5, [2,'*', 4], [2,'**', 4]])

print(new_list)

如果执行此代码,您将在控制台上看到以下结果:

[7, 3, 5, 8, 16]