问题描述
我尝试用字典的形式编写分解化学式的代码,如下所示。
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,'Cl': 1},{'C': 2,'H': 4},{'K': 1,'Mn': 1,'O': 4 }]
解决方法
似乎您可以使用正则表达式轻松解析这些符号,该表达式查找一个大写字母后跟可选的小写字母和数字。分组捕获它们将使您相当容易地制作 dicts:
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')]
这样的元组,然后您可以使用 dict comprehension 处理这些元组以将空字符替换为 1
。