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