Python 解析数学表达式
下面的代码使用函数“eqn”将一个字符串“d”转换成一个整数和运算符的列表,其中“add”、“subtract”、“multiply”和“divide”分别表示+、-、*和/或。还有一个“否定”操作符,它接受任何正整数并将其转换为负整数。输入和输出示例:Python 解析数学表达式,python,parsing,operators,python-3.4,Python,Parsing,Operators,Python 3.4,下面的代码使用函数“eqn”将一个字符串“d”转换成一个整数和运算符的列表,其中“add”、“subtract”、“multiply”和“divide”分别表示+、-、*和/或。还有一个“否定”操作符,它接受任何正整数并将其转换为负整数。输入和输出示例: 等式(“10 5添加”)应产生[10、5和“添加”] eqn(“5 6添加2否定除法”)应产生[5,6,“添加”、-2,“除法”] 但是,对于否定函数,如果它没有正确使用(不是在数字之后),那么函数应该返回第一个不正确的“否定”的索引号 例
- 等式(“10 5添加”)应产生[10、5和“添加”]
- eqn(“5 6添加2否定除法”)应产生[5,6,“添加”、-2,“除法”]
- 等式(“否定2加2”)应产生0的输出
- 等式(“2 4添加否定”)应产生3的输出
def eqn(d): extrac = [] for e in eqnStr.split(): if len(e) == 0: continue try: extrac.append(int(e)) continue except ValueError: pass try: extrac.append(float(e)) continue except ValueError: pass extrac.append(e) return extrac
eqn(“5 6添加2否定除法”)应该产生[5,6,“添加”,-2,“除法”]的输出,但相反,产生[5,6,“添加”,2,“否定”,“除法”]如何解决这个问题,如何让它显示第一个无效否定的索引号?您需要添加一个特殊情况来处理否定。试着这样做:
def eqn(d):
extrac = []
for e in d.split():
if len(e) == 0:
continue
try:
extrac.append(int(e))
continue
except ValueError:
pass
try:
extrac.append(float(e))
continue
except ValueError:
pass
if e == 'negate':
if isinstance(extrac[-1], str):
return len(extrac)
else:
extrac[-1] *= -1
continue
extrac.append(e)
return extrac
输出:
eqn("2 4 add negate")
=> 3
eqn("5 6 add 2 negate divide")
=> [5, 6, 'add', -2, 'divide']
这是一种错误的RPN方法,它应该包括在解析列表时将操作数推到堆栈上或从堆栈中弹出 例如,
eqn([1,2,3,'+','*')
将执行(3+2)*1
。内置python“list”类型支持追加(推送)和弹出
这里有更多关于RPN的信息:2 4 add negate->变成3?@ergonaut是的,因为negate在另一个操作符之后,3是negateSeems的索引。对我来说,
negate
中存在一些差异。你需要一步一步地解释这个问题。这显然不是RPN的工作方式。