python 化学_用Python解析化学公式

问题是:给定类似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

但是现在我被困住了.

随着编码问题变得越来越长,并且涉及到混合数据结构来解决,我有点陷入困境.在这里,他们使用哈希表和堆栈.

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

谢谢.

解决方法:

我认为您可以使用递归来解决此问题.这是您的函数应如何工作:

>就像您在第一个代码中一样,直到遇到左括号.

>遇到左括号,请找到相应的右括号.这可以通过一个计数器来完成:将其初始化为1,然后在遇到新的右括号时,将计数器递增,而在遇到右括号时,将其递减.当计数器等于0时,您已找到匹配的右括号.

>在括号之间剪切字符串,并使用该字符串调用相同的函数(这是递归方面).

>将返回的字典中的值添加到当前字典中,然后乘以括号后面的数字.

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

编辑:关于堆栈方法

堆栈方法只是模拟递归.它具有一堆计数器,而不是再次调用该函数并具有本地计数器.当打开括号时,它会在此上下文中计数;当关闭括号时,它将与包含它的上下文合并,并具有相应的多重性.

到目前为止,我更喜欢递归方法,这种方法更自然.

标签:data-structures,stack,hash,python,algorithm

来源: https://codeday.me/bug/20191025/1927824.html

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值