词典作业未按预期运行

问题描述 投票:0回答:2

语境

我正在创建一个计算器。我现在想让我的计算器执行 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
中括号的索引。请帮助。

python dictionary variable-assignment
2个回答
0
投票

你在创建集合,而不是字典。见下文:

a = {1, 2}
这是一个包含 1 和 2 的集合。

b = {1: 2}
这是一个字典,其中 2 存储了键 1 的值。


-2
投票

问题似乎与在 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}]

希望对您有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.