Python 将字典转换为数学表达式

Python 将字典转换为数学表达式,python,dictionary,tuples,list-comprehension,dictionary-comprehension,Python,Dictionary,Tuples,List Comprehension,Dictionary Comprehension,需要对字典中的数字进行计算 {'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}},

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

{'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}}}
[8+6x8]+[8+4x8+6] [14x8]+[12x14] 112+168 280 以下是我尝试的代码:

    Eg: {'YOU': {'HE': {'EST': 8, 'OLM': 6}, 'SLO': {'WLR': 8}},
 'WORK': {'KOE': {'RIW': 8, 'PNG': 4}, 'ROE': {'ERC': 8, 'WQD': 6}}} for this example the output would be
它给出了:

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

无论如何不要使用eval,它是不安全的eval是邪恶的

关于评估危害的更多细节,有太多了,我只挑选了一本阅读

对解决方案的一些启示

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

不过,这只是一个小小的尝试,希望它能帮助你应对挑战

那么,给你:

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

规则没有很好的定义,但我还是要试一试。我假设您只想将此计算应用于键,并在嵌套字典中工作。我认为列表理解会变得相当复杂,而且使用循环更具可读性

对于你和工作的每个关键点,我将这两组最里面的值8+6,8为你和8+4,8+6为工作,将这些值乘以14*8为你和12*14为工作,然后将乘积相加得到结果=280

输出:

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

keys = ['YOU','WORK']
result = 0
for key in keys:
    inner_keys = dict_nested[key].keys()
    # multiply the values together for the first values of the inner key
    inner_product = 1
    for inner_key in inner_keys:
        inner_product *= sum(list(dict_nested[key][inner_key].values()))
        # print(inner_product)
    result += inner_product

那么,输出应该是什么样子呢?为什么有时要加,有时要乘?规则是什么?那么这个计算只适用于你和字典中的键吗?@ElmoVanKielmo为什么?我喜欢这种方法,但你忽略了一些未指定的规则,有时我们加,有时我们乘。@KennyOstrom你说得很对。在操作数赋值中没有找到合理的解释。我只是想尝试一下,也许可以帮助他应对挑战。@KennyOstrom在《华盛顿邮报》上因操作数不一致而出名。@ElmoVanKielmo我很喜欢读你的评论,eval确实是邪恶的。这段代码只是为了运行。在极少数情况下,我发现eval在生产代码中从未有用过,当然,我对eval的使用提出了警告——感谢您的提醒。
dict_nested = {'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}}}

keys = ['YOU','WORK']
result = 0
for key in keys:
    inner_keys = dict_nested[key].keys()
    # multiply the values together for the first values of the inner key
    inner_product = 1
    for inner_key in inner_keys:
        inner_product *= sum(list(dict_nested[key][inner_key].values()))
        # print(inner_product)
    result += inner_product
>>> result
280