我想做一个简单的计算器,你只需要输入像"2+2*2"然后计算出答案。第一步是找到并剪掉单个数字,我试着在下面这样做。
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)
但是当我输入:
Calculate: 2+2*2=
我没有得到预期的输出:
{'N0':'2+', 'N1':'2*','N2':'2='}
而是:
{'N5': '2+2*2'}
我对python还很陌生,所以如果有什么我可以做得更好的,也请告诉我。谢谢。
要得到你添加到你的问题中的结果有很多小的变化,所以我将逐一进行。
我已经创建了一个空字典来存储你的子方程:subequation = {}
for symbols in equation:
的原始for循环将覆盖您的符号列表,我相信您要做的是遍历每个符号并检查它们是否在方程中,您可以使用for循环然后使用if语句,如下所示:
for symbol in symbols:
if symbol in equation:
正如Jhanzaib Humayun在评论中提到的,你在每个循环中重写你的子方程,而不是添加,所以他们提供了添加到字典的代码,如下所示:
subequation[f"N{x}"]= equation[0:equation.find(symbols)]
但是equation[0:equation.find(symbols)]
将总是从等式的开始开始并返回到(不包括符号)的所有内容,因此将返回:
{'N0': '2', 'N1': '2+2', 'N2': '2+2*2'}
这不是你想要的,所以我把它改成:
equation[equation.find(symbol)-1:equation.find(symbol)+1]
现在只包括数字和符号,但正如Titouan L评论的那样,这对于具有多个数字的数字不起作用,所以我提出了一个last_symbol
变量,它将从它正在查找的符号向后工作,以找到最后一个,并在两者之间保持任何东西。我已经这样做了:
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]
从符号开始反向查找所有之前的符号([i for i in range(equation.find(symbol)-1, 0, -1) if equation[i] in symbols]
)的索引,并找到最大值(即最近的)。我将[-1]添加到这个列表中,作为第一个符号,不会有前一个符号,当添加到字典中时,我已经完成了equation[last_symbol+1:equation.find(symbol)+1]
,所以对于第一个符号,这将从0:equation.find(symbol)+1
完整代码是:
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)
返回所需的以下内容:
{'N0': '2+', 'N1': '2*', 'N2': '2='}
正如一些注释所提到的,每个循环都覆盖变量subequation
。最重要的是,变量symbols
被循环变量覆盖。
为了获得与您所要求的相同的输出,我更改了for循环以遍历每个字符并检查它是否与列表symbols
中的符号匹配。
print("Put an equals sign at the end to finish the equation.")
equation = input("Calculate: ")
symbols = ["+", "-", "*", "/", "="]
subequation = {}
x = 0
for i in range(len(equation)):
if equation[i] in symbols:
subequation[f"N{x}"] = equation[x:i+1]
x = i+1
print(subequation)
输出如下:
{'N0': '2+', 'N2': '2*', 'N4': '2='}
正如Emi OB所评论的那样,您在for循环中覆盖符号以及子方程。
我想你的意思是这样的:
print("Put an equals sign at the end to finish the equation.")
equation = input("Calculate: ")
symbols = ["+","-","*","/","="]
subequation = {f"N{x+1}" : equation[0:equation.find(symbols[x])] for x in range(len(symbols))}
print(subequation)