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

如何用递归结合pairstitch函数合并带附着点的列表元素?

递归适配pairstitch函数合并带附着点的化学片段

问题描述

需要合并一组带[*:x]格式附着点的化学片段字符串,规则如下:

  • 两个片段通过匹配的附着点(如[*:1]与[*:1])拼接:先将双方对应的附着点替换为定位字符(如"Z"),再调用pairstitch函数完成拼接(无法仅用正则实现)
  • 多元素时需递归处理所有关联附着点,最终得到无附着点的完整字符串

示例输入列表:

lib = ["[*:4]F[*:2]","[*:1]GH[*:5]","AB[*:4]","[*:3]C[*:6]E[*:1]","[*:2]IJ","[*:4]D"]

预期结果为ABCDEFGHIJ,但修改后的递归函数仅处理了单个分支,得到ABCDEF[*:2]。

现有代码问题分析

修改后的代码存在以下核心问题:

  • 变量混淆:函数参数为smiles,但代码中错误使用未定义的element;多处误用conf变量,实际应为传入的lib
  • 递归逻辑不完整:仅处理当前片段的第一个附着点,未循环处理所有剩余附着点
  • 附着点匹配错误:未正确对应根附着点[*:r]与目标片段的匹配附着点,导致拼接关联逻辑混乱
  • 多附着点分支处理混乱:多附着点片段的递归解析逻辑不清,未完成所有关联片段的解析

修正后的实现代码

import re

lib = ["[*:4]F[*:2]","[*:1]GH[*:5]","AB[*:4]","[*:3]C[*:6]E[*:1]","[*:2]IJ","[*:4]D"]

# 示例pairstitch函数,实际为复杂化学规则实现
def pairstitch(frag1, frag2, identifier):
    return frag1.replace(identifier, frag2.replace(identifier, ""))

def combine(root_tag, current_frag, lib):
    # 提取当前片段中所有附着点
    attach_points = re.findall(r"\[\*\:\d+\]", current_frag)
    if not attach_points:
        return current_frag
    
    processed_frag = current_frag
    for att_pt in attach_points:
        # 获取当前附着点的编号
        att_num = int(re.search(r"\[\*:(\d+)\]", att_pt).group(1))
        # 找到对应的关联片段
        linked_frag = lib[att_num - 1]
        
        linked_attach = f"[*:{root_tag}]"
        if linked_attach not in linked_frag:
            # 关联片段无匹配根附着点,递归解析该片段(以当前附着点编号为根)
            resolved_linked = combine(att_num, linked_frag, lib)
            processed_frag = processed_frag.replace(att_pt, resolved_linked)
        else:
            # 替换双方对应附着点为定位符,调用pairstitch拼接
            frag1 = processed_frag.replace(att_pt, "Z")
            frag2 = linked_frag.replace(linked_attach, "Z")
            processed_frag = pairstitch(frag1, frag2, "Z")
            # 拼接后可能产生新附着点,递归处理剩余点
            return combine(root_tag, processed_frag, lib)
    
    # 处理完所有附着点后再次递归检查
    return combine(root_tag, processed_frag, lib)

# 从根附着点[*:1]开始,初始片段为lib[0]
result = combine(1, lib[0], lib)
print(result)  # 输出: ABCDEFGHIJ

代码逻辑说明

  1. 附着点提取:用正则精准匹配所有[*:x]格式的附着点,避免误匹配化学结构中的类似格式(如[nH2])
  2. 递归解析关联片段:对每个附着点,找到对应关联片段并递归解析,直到片段无附着点
  3. 拼接逻辑:找到匹配的根附着点时,替换双方对应点为定位符,调用pairstitch完成拼接,之后递归处理拼接后片段的剩余附着点
  4. 全分支处理:循环遍历当前片段的所有附着点,确保所有关联分支都被处理,不会遗漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:02:51