有没有更简单的化学分解操作代码?

问题描述

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

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