是否有更简单的化学分解操作规范?



我尝试用字典的形式编写分解化学式的代码,如下图所示。

def decompose(material):
parsed = {}   
for i in range(len(material)):
if material[i].isupper():
if material[i+1].islower():
element = material[i:i+2]
if (i+2) < len(material) and material[i+2].isnumeric():
num = int(material[i+2])                   
else:                   
num = 1 
elif material[i+1].isnumeric():              
if (i+2) < len(material) and material[i+2].isnumeric():            
num = int(material[i+1]+material[i+2])           
else:           
num = int(material[i+1])
element = material[i]      
else:
element = material[i]
num = 1
parsed[element]=num  
return parsed 

您将得到如下所示的结果。

example = ['NaCl', 'C2H4', 'KMnO4']
example_list = list(decompose(i) for i in example)
example_list

[{"Na":1、"氯":1},{' C ': 2,"H":4},{"K":1、"锰":1、"O":4}]

对于这段代码有没有更简单的方法?我真的很感激:)

似乎可以很容易地解析这些符号,使用正则表达式查找一个大写字母,后跟可选的小写字母和数字。将它们分组捕获将使您相当容易地创建字典:

import re
example = ['NaCl', 'C2H4', 'KMnO4']
# one uppercase letter followed by optional lowercase letters 
# followed by zero or more digits
rx = re.compile(r'([A-Z][a-z]*)(d*)')
for x in example:
print({k:int(count) if count else 1 for k, count in rx.findall(x)})

打印:

{'Na': 1, 'Cl': 1}
{'C': 2, 'H': 4}
{'K': 1, 'Mn': 1, 'O': 4}

上面的findall()将生成类似[('C', ''), ('O', '2')]的元组,然后您可以使用字典推导处理将其空替换为1

最新更新