I am currently trying to do something like a calculator where invalid inputs produce an error. However, I am running into an error where they say the index is out of the list when i input ( 2 + 7 ). So instead, I was thinking that if I can the loop if the last index of the list is == ‘)’. For the purpose of this exercise, each item in the list is split with a space. split( )
I am unable to import any libraries
def blanks(exprlist):
for n, token in enumerate(exprlist):
if exprlist[n] == '(' and exprlist[n+1] == ')':
print(f"Invalid expression, expecting operand between {' '.join(exprlist[:n+1])} and {' '.join(exprlist[n+1:])}")
return False
elif exprlist[n] == ')' and exprlist[n+1] == '(':
print(f"Invalid expression, expecting operator {' '.join(exprlist[:n+1])} and {' '.join(exprlist[n+1:])} ")
return False
elif exprlist[n] == ')' and exprlist[n+1] in ')//+-**':
return True
return True
def main():
expr = input('Enter expression: ')
if expr == '':
print('Application ended')
break
if blanks(exprlist):
eval(expr)
else:
continue
The expected output is that the program is supposed to eval( 2 + 7 ) instead of running into the error.
Advertisement
Answer
Here:
for n, token in enumerate(exprlist):
if exprlist[n] == '(' and exprlist[n+1] == ')':
when you reach the last item, n is the index of the last item, so there isn’t anything at n+1 indeed.
The pythonic solution here is to use zip() to generate a sequence of (item, next_item) pairs:
for token, next_token in zip(exprlist, exprlist[1:]):
if token == '(' and next_token == ')':
# etc