首页 > 解决方案 > 是否可以用字符串计算,当和字符串包含字典的键时

问题描述

我一直在寻找使用 str 输入中的值的方法,其中一些值(str 的)是我拥有的字典的键。然后用键的值计算。这很难解释,但这里是一个例子:

我对元素周期表的每个元素都有一个字典(每个字典都包含元素的质量,键为“原子量”(H 的质量为 1.008u。)

我想计算输入字符串时的分子质量,例如:“H*2+O”,即 H20 (18u)

这是我目前所拥有的:

molecularmass = str(input("Write which molecular mass you want f.example: H*2+O this is H2O (water): "))
for sym in element.keys():
    if element[sym]["Sym"] in molecularmass:
    print(element[sym]["Sym"])
    molecularmass.replace(element[sym]["Sym"], str(element[sym]["Atomic weight"]))

标签: pythonstringdictionarychemistry

解决方案


一种快速简便的方法是将每个元素设置为包含其原子质量的变量,然后在输入上使用 eval。修改您的示例将导致:

molecularmass = str(input("Write which molecular mass you want f.example: H*2+O this is H2O (water): "))
        for sym in element.keys():
            if element[sym]["Sym"] in molecularmass:
                print(element[sym]["Sym"])
                molecularmass.replace(element[sym]["Sym"], str(element[sym]["Atomic weight"]))
        print(eval(molecularmass))
      

Eval 是邪恶的,它给程序带来了许多安全隐患,尤其是在以这种方式使用它时。如果这是您自己的程序,我只会建议在此处使用它,如果出现问题,您可以重新启动。

正确的方法是将字符串解析为语法,然后运行。为此,您需要使用词法分析器对输入进行标记,然后对这些标记应用语法以创建解析树。考虑到你的问题,这似乎有点矫枉过正。

对于您的词法规则,我会使用 [AZ][az]? 对于元素。


推荐阅读