字典制作奇怪的 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='}
我想制作一个简单的计算器,您只需在其中输入“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='}