Python化合物原子计数字典开发:重复元素计数累加问题求助
化学式原子计数问题修复
你的代码无法累加重复元素的核心原因是:每次遇到元素时直接给count[string]赋值,而非在已有计数基础上累加。此外代码还存在以下缺陷:
- 仅能处理单个括号结构,无法支持嵌套括号
- 只能识别单个数字(如
2),无法处理多位数(如10) - 元素边界判断逻辑依赖索引,容易出错
修复后的代码(支持重复元素累加、多位数、嵌套括号)
import re def parse_chemical_formula(formula): count = {} # 正则匹配:括号组(含嵌套)、元素名、数字 pattern = re.compile(r'(\((?:[^()]+|(?R))*\)(\d+))|([A-Z][a-z]?)(\d*)') def process_group(group_str, multiplier): # 递归解析括号内的子化学式 sub_count = parse_chemical_formula(group_str) for elem, num in sub_count.items(): count[elem] = count.get(elem, 0) + num * multiplier for match in pattern.finditer(formula): if match.group(1): # 处理括号组 group_content = match.group(1).strip('()') multiplier = int(match.group(2)) if match.group(2) else 1 process_group(group_content, multiplier) else: # 处理单个元素 elem = match.group(3) num = int(match.group(4)) if match.group(4) else 1 count[elem] = count.get(elem, 0) + num return count # 运行测试 formula = input("输入化合物化学式: ") print(parse_chemical_formula(formula))
关键修复点说明
- 重复元素累加:用
count.get(elem, 0) + num实现累加逻辑——元素已存在则取现有值加新数量,不存在则从0开始累加 - 正则解析:通过递归正则一次性匹配元素、数字、括号组,替代手动遍历字符的繁琐逻辑,避免索引错误
- 多位数支持:正则
\d*匹配任意长度数字,转换为整数时默认值设为1 - 嵌套括号处理:递归函数
process_group解析括号内的子化学式,再乘以括号后的倍数累加到总计数
测试示例
输入CH₃COOH(或CH3COOH),返回:{'C': 2, 'H': 4, 'O': 2}
输入(NH4)2SO4,返回:{'N': 2, 'H': 8, 'S': 1, 'O': 4}
内容的提问来源于stack exchange,提问作者Tazer
相关产品推荐
相关产品推荐

