我尝试用字典的形式编写分解化学式的代码,如下图所示。
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
。