【问题标题】:Converting a dictionary to a mathematical expression将字典转换为数学表达式
【发布时间】:2020-12-15 07:32:13
【问题描述】:
{'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, 'OLM': 6}, 'SLO': {'WLR': 8}},
 'WORK': {'KOE': {'RIW': 8, 'PNG': 4}, 'ROE': {'ERC': 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', '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)]

【问题讨论】:

  • 那么输出应该是什么样子?
  • 为什么有时加,有时乘?规则是什么?
  • 那么这个计算是否只适用于字典中的键YOUWORK

标签: python dictionary tuples list-comprehension dictionary-comprehension


【解决方案1】:

规则没有明确定义,但我还是会试一试。我假设您只希望此计算应用于嵌套字典中的键 YOUWORK。我认为列表推导会变得非常复杂,并且使用循环更具可读性。

对于YOUWORK 的每个键,我将这两组最里面的值8+6, 8 相加为YOU8+4, 8+6WORK,将这些值相乘在一起14*8YOU12*14WORK,然后将产品加在一起得到结果 = 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

输出:

>>> result
280

【讨论】:

    【解决方案2】:

    注意

    无论如何不要使用eval,它是不安全的(“eval is evil”)。

    有关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}')
    

    【讨论】:

    • @ElmoVanKielmo 为什么?
    • 我喜欢这种方法,但您错过了一些未指定的规则,有时我们会添加,有时会相乘。
    • @KennyOstrom 你说的很对。在 OP 操作数分配中没有找到合理的解释。只是想尝试一下,或许可以帮助他应对挑战。
    • @KennyOstrom 在关于操作数不连贯的帖子中注意到 OP。
    • @ElmoVanKielmo 我很喜欢阅读您的评论,eval 确实是邪恶的。这段代码只是为了运行。在我发现 eval 有用的极少数情况下(当然,在生产代码中从来没有),我就eval 的使用发出警告通知 - 谢谢你提醒我。
    猜你喜欢
    • 2017-05-01
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多