2016-02-08 3 views
0

У меня возникают проблемы с анализом аргументов, введенных в командной строке, которые становятся частью списка. Следующий код правильно идентифицирует, является ли аргумент либо операнд или число, и, таким образом, делает расчеты правильно:Идентификация элементов в списке из sys.argv, чтобы сделать обратную польскую нотацию

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] 

Я попытался положительно идентифицирующим если элементы номер (поплавки или целые числа) и отрицательно идентифицировать, если элементы не являются операндами, но ни один из них не работает. Либо командная строка не распознает, что элемент не является операндом, либо не распознает, что этот элемент является float или integer. Любые мысли о том, как определить, являются ли элементы списка числами или операндами?

ответ

0

Вы можете определить, является ли значение оператора, проверяя, существует ли оно в качестве ключа в вашем 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, ...} 
+0

Спасибо, это лучший способ сделать это в будущем. –

+0

@NatG: Это лучший способ сделать это сейчас и в будущем. Синтаксически это намного лучше, чем использование нескольких условий в выражении if. Он менее подвержен ошибкам, более удобен в обслуживании и легко расширяется. – mhawke

1

Вы не правильно соблюдали Закон ДеМоргана. Второй пример должен использовать «и» между частями «! =».

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

Огонь! Спасибо, что решил. –