I want to make a simple calculator, where you just type in something like “2+2*2” and it calculates the answer. First step was to find, and cut out the individual numbers, which I tried doing below.
print("Put an equals sign at the end to finish the equation.") equation = input("Calculate: ") symbols = ["+","-","*","/","="] x = 0 for symbols in equation: subequation = {f"N{x}" : equation[0:equation.find(symbols)]} x = x + 1 print(subequation)
But when I input:
Calculate: 2+2*2=
I don’t get the expected output of:
{'N0':'2+', 'N1':'2*','N2':'2='}
But rather:
{'N5': '2+2*2'}
I’m still very new to python, so please also tell me if there’s anything I can do better. Thanks.
Advertisement
Answer
There are a lot of small changes to get the result you added to your question, so I will go through each one.
I’ve created an empty dictionary to store your sub equation in: subequation = {}
Your original for loop of for symbols in equation:
would overwrite your list of symbols, I believe what you are trying to do is go through each of the symbols and check if they are in the equation, which you can do with a for loop and then an if statement as below:
for symbol in symbols: if symbol in equation:
As mentioned by Jhanzaib Humayun in the comments, you’re overwriting your subequation in each loop, rather than adding, so they have provided the code to add to a dict as below:
subequation[f"N{x}"]= equation[0:equation.find(symbols)]
But equation[0:equation.find(symbols)]
will always start from the begining of the equation and return everything up to (and not including the symbol), so would return:
{'N0': '2', 'N1': '2+2', 'N2': '2+2*2'}
Which is not what you want, so I changed this to:
equation[equation.find(symbol)-1:equation.find(symbol)+1]
Which will now only include the number and symbol, but as Titouan L commented, this won’t work for numbers with multiple digits, so I have come up with a last_symbol
variable which will work backwards from the symbol it’s looking at to find the last one, and keep anything in between. I have done this as below:
last_symbol = max([i for i in range(equation.find(symbol)-1, 0, -1) if equation[i] in symbols] + [-1]) subequation[f"N{x}"]= equation[last_symbol+1:equation.find(symbol)+1]
This works backwards from the symbol to find the indexes of all previous symbols ([i for i in range(equation.find(symbol)-1, 0, -1) if equation[i] in symbols]
) and finds the maximum of this (i.e. the most recent). I added [-1] to this list as for the first symbol, there will not be a previous symbol, and when adding to the dictionary, I have done equation[last_symbol+1:equation.find(symbol)+1]
, so for the first symbol, this will go from 0:equation.find(symbol)+1
The full code is:
print("Put an equals sign at the end to finish the equation.") equation = input("Calculate: ") symbols = ["+","-","*","/","="] subequation = {} x = 0 for symbol in symbols: if symbol in equation: last_symbol = max([i for i in range(equation.find(symbol)-1, 0, -1) if equation[i] in symbols] + [-1]) subequation[f"N{x}"]= equation[last_symbol+1:equation.find(symbol)+1] x = x + 1 print(subequation)
Which returns the below as desired:
{'N0': '2+', 'N1': '2*', 'N2': '2='}