You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))

关键修复点说明

  1. 重复元素累加:用count.get(elem, 0) + num实现累加逻辑——元素已存在则取现有值加新数量,不存在则从0开始累加
  2. 正则解析:通过递归正则一次性匹配元素、数字、括号组,替代手动遍历字符的繁琐逻辑,避免索引错误
  3. 多位数支持:正则\d*匹配任意长度数字,转换为整数时默认值设为1
  4. 嵌套括号处理:递归函数process_group解析括号内的子化学式,再乘以括号后的倍数累加到总计数

测试示例

输入CH₃COOH(或CH3COOH),返回:{'C': 2, 'H': 4, 'O': 2}
输入(NH4)2SO4,返回:{'N': 2, 'H': 8, 'S': 1, 'O': 4}

内容的提问来源于stack exchange,提问作者Tazer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:48:26