用Python解析化学公式

用Python解析化学公式,python,algorithm,data-structures,hash,stack,Python,Algorithm,Data Structures,Hash,Stack,我正在努力解决这个问题: 问题是:给定一个类似于C(Mg2(OH)4)2的公式,返回一个包含元素及其计数的哈希表。元素名称始终以大写字母开头,后面可能跟一个小写字母 我想我将首先解决最简单的情况:没有括号 def bracket_hash(formula): element = "" atom_count = 0 element_hash = {} for x in formula: if x.isupper(): if

我正在努力解决这个问题:

问题是:给定一个类似于
C(Mg2(OH)4)2
的公式,返回一个包含元素及其计数的哈希表。元素名称始终以大写字母开头,后面可能跟一个小写字母

我想我将首先解决最简单的情况:没有括号

def bracket_hash(formula):
    element = ""
    atom_count = 0
    element_hash = {}

    for x in formula:
        if x.isupper():
            if element!="":
                element_hash[element] = 1
                element = ""
            element = x

        elif x.islower():
            element += x            

        else: 
            element_count = int(x)
            element_hash[element] = element_count
            element_count = 0
            element = ""

    if element!="":
        element_hash[element] = 1

    return element_hash
此代码在以下情况下运行良好:

print(bracket_hash("H2O"))
print(bracket_hash("CO2"))
print(bracket_hash("Mg2O4"))
print(bracket_hash("OH"))
现在我想,一定要用堆栈来处理多个括号的情况,比如
OH(Ag3(OH)2)4
,这里Ag的计数必须是3*4,O和H的计数将是2*4+1

到目前为止,我从以下内容开始:

def formula_hash(formula):
    stack = []
    final_hash = {}
    cur = ""
    i = 0

    while i < len(formula):
        if formula[i] == '(':
            j = i
            while formula[j]!=')':
                j = j + 1
            cur = formula[i:j]
            stack.append(bracket_hash(cur))
            cur = ""
            i = j + 1
def公式\u散列(公式):
堆栈=[]
final_hash={}
cur=“”
i=0
而i
但现在我被卡住了

随着编码问题变得越来越长,需要解决的数据结构也越来越多,我有点被卡住了。这里他们使用哈希表和堆栈

所以我的问题是:如何将这个问题分解成可管理的部分并解决它。如果我真的要解决这个问题,我必须将它映射到可管理的代码段。任何帮助都将不胜感激


谢谢。

我想你可以用递归来解决这个问题。以下是您的功能应该如何工作:

  • 像在第一段代码中那样操作,直到遇到一个左括号
  • 当遇到左括号时,请查找相应的右括号。这可以通过一个计数器来完成:将其初始化为1,然后当遇到新的左括号时,递增计数器,当遇到右括号时,递减计数器。当计数器等于0时,您已找到匹配的右括号
  • 在括号之间剪切字符串,并使用该字符串调用相同的函数(这是递归方面)
  • 将返回的字典中的值乘以括号后的数字,添加到当前字典中
如果您在实现此解决方案的某些部分时遇到问题,请告诉我,我将提供更多详细信息

编辑:关于堆栈方法 堆栈方法只是模拟递归性。它没有再次调用函数并使用本地计数器,而是使用了一堆计数器。当一个左括号被打开时,它在这个上下文中计数,当它被关闭时,它与包含它的上下文合并,并具有相应的多重性


到目前为止,我更喜欢递归方法,它更自然。

您可能想在谷歌上搜索
python解析器生成器。解析器生成器是一个库,它可以帮助开发人员为任何类型的公式或语言(技术上是任何“语法”)创建解析器,而无需从头开始做所有工作

你可能需要做一些阅读来理解一个化学公式所遵循的语法类型


Python的一个有趣的概述是。

@LoiusSugy感谢您能用堆栈方法解释一下。。。我将尝试实现这一点。添加了一些关于堆栈方法的细节。我认为他们问题的目的不是完成工作,而是学习如何执行算法。即使如此,研究最新技术可能也是一个好主意。解析不是一件小事。