字典制作奇怪的 key:value 对

Dictionary making weird key:value pairs

我想制作一个简单的计算器,您只需在其中输入“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 还是很陌生,所以也请告诉我是否有什么地方可以做得更好。谢谢。

正如 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)

要获得您添加到问题中的结果,需要进行很多小的更改,因此我将逐一进行检查。

我创建了一个空字典来存储你的子方程:subequation = {}

你原来的 for symbols in equation: 循环会覆盖你的符号列表,我相信你要做的是遍历每个符号并检查它们是否在等式中,你可以这样做使用 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)] 将始终从等式的开头开始,并且 return 直到(不包括符号)的所有内容,return:

也是如此
{'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)

根据需要 return 以下内容:

{'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='}