语境
我正在创建一个计算器。我现在想让我的计算器执行 BODMAS(从最里面的括号开始计算)。
用户输入一个表达式,在这个例子中是:
expression = (1+(1+1))
我有一个函数将此函数拆分为“术语”并将结果保存在
expression_list
.
expression_list = ['(', '1', '+', '(', '1', '+', '1', ')', ')']
我有一个函数,可以在
expression_list
中找到所有括号的索引并将其保存在b_pairs
中。
对于上述表达式,b_pairs
的
intended输出应为以下形式:
b_pairs = [{'ob_1', 0}, {'ob_2', 3}, {'cb_1', 7}, {'cb_2', 8}]
这里是函数:
for term in expression_list:
if term == '(':
b_pairs.append({"ob_"+str(ob),index})
ob+=1
elif term == ')':
b_pairs.append({"cb_"+str(cb),index})
cb+=1
index+=1
其中
'ob'
代表开括号,'oc'
代表闭括号。
问题
该函数之所以有效,是因为它正确识别了开/关括号的位置及其各自的位置,但它混淆了格式。这是实际结果:
b_pairs = [{0, 'ob_1'}, {'ob_2', 3}, {'cb_1', 7}, {8, 'cb_2'}]
注意 (a)
b_pairs[0]
和 (b) b_pairs[1]
中的顺序。我希望 key 是括号的名称,而 value 是括号在 expression_array 中的位置,例如{'ob_1,0},而不是相反。
我已经编码,格式应该像
b_pairs[1]
,但由于一些奇怪的原因,它并不总是这样。
我已经调试了代码,但我看不出发生这种情况的任何逻辑原因。我知道具有多个键/值对的字典不会总是按顺序打印,但在这个例子中,
expression_list
中的字典变量是单个键/值,我编码使得键应该是括号的名称,不是expression_list
中括号的索引。请帮助。
你在创建集合,而不是字典。见下文:
a = {1, 2}
这是一个包含 1 和 2 的集合。
b = {1: 2}
这是一个字典,其中 2 存储了键 1 的值。
问题似乎与在 for 循环的 if 和 elif 语句中将键和值附加到字典的顺序有关。您在一种情况下将键附加在值之前,在另一种情况下将键附加在值之后,导致字典项目的顺序不一致。
要解决这个问题,您应该始终以相同的顺序附加键和值。这是您的代码的更新版本,首先附加密钥,然后附加值:
for term in expression_list:
if term == '(':
b_pairs.append({"ob_"+str(ob):index})
ob+=1
elif term == ')':
b_pairs.append({"cb_"+str(cb):index})
cb+=1
index+=1
通过在键和值之间使用冒号,我们以预期的方式正确地格式化了字典。现在,b_pairs 的输出应该如下所示:
b_pairs = [{'ob_1': 0}, {'ob_2': 3}, {'cb_1': 7}, {'cb_2': 8}]
希望对您有所帮助!