【问题标题】:Parsing a Chemistry Formula in Python在 Python 中解析化学公式
【发布时间】:2018-08-07 02:54:46
【问题描述】:

我正在尝试解决这个问题:https://leetcode.com/articles/number-of-atoms/#approach-1-recursion-accepted。

问题是:给定一个像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

但现在我被卡住了。

我有点卡住了,因为编码问题变得越来越长并且涉及到混合数据结构来解决。在这里他们使用哈希表和堆栈。

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

谢谢。

【问题讨论】:

    标签: python algorithm data-structures hash stack


    【解决方案1】:

    我认为你可以使用递归来解决这个问题。以下是您的函数的工作方式:

    • 像第一个代码中那样做,直到遇到左括号。
    • 当您遇到左括号时,请找到相应的右括号。这可以用一个计数器来完成:将它初始化为 1,然后当你遇到新的左括号时,你会增加计数器,当你遇到右括号时,你会减少它。当计数器等于 0 时,您已找到匹配的右括号。
    • 剪切括号之间的字符串并使用该字符串调用相同的函数(这里是递归方面)。
    • 将返回字典中的值添加到当前字典中,乘以括号后面的数字。

    如果您在实施此解决方案的某些部分时遇到问题,请告诉我,我会提供更多详细信息。

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

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

    【讨论】:

    • @LoiusSugy 谢谢你能用堆栈方法解释一下......我会尝试实现这个......
    • 添加了一些关于堆栈方法的细节。
    【解决方案2】:

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

    您可能需要阅读一些内容才能了解化学式所遵循的语法类型。

    一个有趣的 Python 概述是 this。

    【讨论】:

    • 我认为他们提出问题的目的不是完成工作,而是学习如何做算法。
    • 即便如此,研究最先进的技术可能是个好主意。解析不是一件小事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多