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

求助:Python实现树形数组转换为特定化学分子式字符串

解决方案

可以写一个递归函数来处理这种嵌套结构,逻辑清晰不容易乱:

def format_formula(items):
    result = []
    for item in items:
        # 每个item是单个键值对的字典
        for subscript, content in item.items():
            if isinstance(content, str):
                # 处理单一元素:下标为1时只写元素,否则拼接元素+下标
                part = content + (str(subscript) if subscript != 1 else "")
                result.append(part)
            elif isinstance(content, list):
                # 处理嵌套子列表,递归处理后加括号,再拼接下标
                sub_part = format_formula(content)
                wrapped = f"({sub_part})" + (str(subscript) if subscript != 1 else "")
                result.append(wrapped)
    # 拼接所有部分得到最终分子式
    return "".join(result)

# 测试示例输入
input_data = [{3: 'Ca'}, {2: [{1: 'P'}, {4: 'O'}]}]
print(format_formula(input_data))  # 输出: Ca3(PO4)2

代码说明

  • 递归处理嵌套:遇到子列表时调用自身先处理内部元素,不管嵌套多少层都能适配(比如[{2: [{1: 'Na'}, {1: [{1: 'H'}, {1: 'C'}, {3: 'O'}]}]}]会转换成Na2(HCO3)2)。
  • 下标自动优化:遵循化学分子式习惯,下标为1时自动省略,大于1时才显示。
  • 遍历逻辑简洁:逐个处理列表中的字典项,每个字典仅含一组键值对,直接遍历即可。

为什么直接拼接效果差?

嵌套结构需要先处理内部子项再处理外部,顺序拼接会搞反逻辑或遗漏括号,递归能完美解决这种“先内后外”的处理需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:15:39