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