我将为您翻译有关IT技术的内容。以下是需要翻译的内容:
这个函数按照优先级从高到低的顺序,从左到右遍历列表,查找算术运算符,当它找到这样的运算符时,就调用相应的函数处理相邻的列表元素(操作数),并用操作结果替换列表中的运算符和操作数。一旦所有操作都执行完毕,列表将只包含一个元素 - 计算结果。
然而,这个函数的行为并不像预期的那样。问题(我认为)是这个函数在迭代列表时修改了列表(通过对切片进行赋值)。我已经在这里找到了解决这个问题的方法(通过在每次修改列表时重启内部
我想知道是否有更好的方式来实现这个算法,以避免奇怪的“重启循环”操作。
感谢您提供的任何想法!
我正在使用Python编写一个计算器(作为练习),有一点让我感到困惑。
程序将输入分解成数字和运算符的列表。然后按照以下方式计算结果:
import operator
ops = {'+' : operator.add, # operators and corresponding functions
'-' : operator.sub,
'*' : operator.mul,
'/' : operator.truediv,
'%' : operator.mod}
precedence = [['*', '/', '%'], ['+', '-']] # order of precedence for operators
def evaluate(exp):
for oplist in precedence: # search for operators first in order of precedence
for op in exp: # then from left to right
if op in oplist:
index = exp.index(op)
result = ops[op](exp[index - 1], exp[index + 1])
# compute the result of the operation
exp[index - 1:index + 2] = [result]
# replace operation and operands with result
return exp[0]
# for example,
evaluate([2, '+', 3, '+', 4, '+', 5])
# should return 14
这个函数按照优先级从高到低的顺序,从左到右遍历列表,查找算术运算符,当它找到这样的运算符时,就调用相应的函数处理相邻的列表元素(操作数),并用操作结果替换列表中的运算符和操作数。一旦所有操作都执行完毕,列表将只包含一个元素 - 计算结果。
然而,这个函数的行为并不像预期的那样。问题(我认为)是这个函数在迭代列表时修改了列表(通过对切片进行赋值)。我已经在这里找到了解决这个问题的方法(通过在每次修改列表时重启内部
for
循环),但给出解决方案的人似乎认为通常应该有更好的方法来完成所需的任务。我想知道是否有更好的方式来实现这个算法,以避免奇怪的“重启循环”操作。
感谢您提供的任何想法!