将字典转换为数学表达式

问题描述

{'YOU': {'HE': {'EST': 8,'OLM': 6},'SLO': {'WLR': 8}},'ARE': {'KLP': {'EST': 6},'POL': {'WLR': 4}},'DOING': {'TIS': {'OIL': 8}},'GREAT': {'POL': {'EOL': 6}},'WORK': {'KOE': {'RIW': 8,'PNG': 4},'ROE': {'ERC': 8,'WQD': 6}},'KEEP': {'PAR': {'KOM': 8,'RTW': 6},'PIL': {'XCE': 4,'ACE': 8}},'ROCKING': {'OUL': {'AZS': 6,'RVX': 8}}}

需要对字典中的数字进行计算。

    Eg: {'YOU': {'HE': {'EST': 8,'WQD': 6}}} for this example the output would be
  • [(8 + 6)x8] + [(8 + 4)x(8 + 6)]
  • [14x8] + [12x14]
  • 112 + 168
  • 280

以下是我尝试的代码

a = [tuple([k]+list(v.keys())+list(j.values())) for k,v in data.items() for i,j in v.items()]

它给出了:

[('YOU','HE','SLO',8,6),('YOU',8),('ARE','KLP','POL',4),('DOING','TIS',('GREAT',('WORK','KOE','ROE',('KEEP','PAR','PIL',4,('ROCKING','OUL',6,8)]

解决方法

这些规则的定义不明确,但是我还是会试一试。我假设您只希望将此计算应用于嵌套字典中的键YOUWORK。我认为列表理解将变得非常复杂,并且使用循环更易读。

对于每个键YOUWORK,我总结了8+6,8YOU的{​​{1}}这两个最里面的值集,将这些值分别乘以8+4,8+6的{​​{1}}和WORK的{​​{1}},然后将乘积相加得到结果= 14*8

YOU

输出:

12*14
,

注意

通过任何方式不要使用eval,这是不安全的(“评估是邪恶的”)。

有关eval有害性的详细信息(太多了,我只是挑了一个),请阅读here

一些寻求解决方案的灵感

正如我之前其他人和更聪明的人指出的那样,在您提供的示例中,我没有找到关于操作数赋值的任何合理解释。

但是,这是一个尝试-希望它能帮助您应对挑战。

所以你去了:

import json

d = {'YOU': {'HE': {'EST': 8,'OLM': 6},'SLO': {'WLR': 8}},'WORK': {'KOE': {'RIW': 8,'PNG': 4},'ROE': {'ERC': 8,'WQD': 6}}}

# Convet dictionary to a string
r = json.dumps(d)

# Convert string to char list
chars = list(r)

# Legal chars needed for computing
legal_chars = ['{','}',','] + [str(d) for d in range(10)]

# Filtering in only legal chars
filtered_chars = [x for x in chars if x in legal_chars]

# Replacing the {} with () and,with +
expression = ''.join(filtered_chars).replace('{','(').replace('}',')').replace(','+')

# Evaluating expression
result = eval(expression)

# (((8+6)+(12))+((8+4)+(8+6)))=52
print(f'{expression}={result}')