从 sys.argv 中识别列表中的元素以进行反向波兰表示法

Identifying elements in a list from sys.argv to do Reverse Polish Notation

我在解析命令行中输入的参数时遇到问题,这些参数成为列表的一部分。 以下代码正确识别参数是操作数还是数字,从而使计算正确:

import operator
ops = { '+': operator.add, '-': operator.sub, '*': operator.mul, '/': operator.div }
import sys
print str(sys.argv)
array = sys.argv
total = 0
for i in range(1,len(array)):
    if array[i] == '+' or array[i] == '-' or array[i] == '*' or array[i] == '/':
        answer = ops[array[i]](float(array[i - 2]),float(array[i - 1]))
        total += answer
print total

所以$ 1 1 + 1 0 -输出3

然而,以上逻辑对于反向波兰表示法是不正确的。下面的逻辑更好(请原谅任何缩进错误),但由于某些原因,现在代码无法识别参数是操作数还是数字:

import operator
ops = { '+': operator.add, '-': operator.sub, '*': operator.mul, '/': operator.div }
import sys
print str(sys.argv)
array = sys.argv
i = 1
my_stack = []
while i < len(array):
#    if array[i] == float(array[i]) or array[i] == int(array[i]):

     if array[i] != '+' or array[i] != '-' or array[i] != '*' or array[i] != '/':
        my_stack.insert(0, array[i])
     else:
        answer = ops[array[i]](float(my_stack[1]),float(my_stack[0]))
        my_stack.pop(1)
        my_stack.pop(0)        
        my_stack.insert(0, answer)
     i = i + 1
print my_stack[0]

我尝试过积极地识别元素是否为数字(浮点数或整数),消极地识别元素是否不是操作数,但这两种方法都不起作用。命令行无法识别该元素不是操作数,或者无法识别该元素是浮点数或整数。 关于如何识别列表元素是数字还是操作数,有什么想法吗?

您没有正确遵循德摩根定律。第二个示例必须在“!=”部分之间使用 "and"。

 if array[i] != '+' and array[i] != '-' and array[i] != '*' and array[i] != '/':

您可以通过检查某个值是否作为键存在于您的 ops 字典中来确定它是否为运算符:

import operator

ops = { '+': operator.add, '-': operator.sub, '*': operator.mul, '/': operator.div }

if array[i] in ops:
    # it's an operator
else:
    # it's an operand... maybe

这样做的好处是您可以轻松支持新运算符,只需将它们添加到 ops 字典中即可,例如模数:

ops = { '%': operator.mod, '+': operator.add, '-': operator.sub, ...}