字典生成奇怪的键值对



我想做一个简单的计算器,你只需要输入像"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)

相关内容

  • 没有找到相关文章