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

如何使用分隔符拆分列表中的复合字符串元素并重组列表

拆分VCF格式CSQ字段到列表项的实现方法

嘿,这问题太常见了——处理VCF文件里的CSQ注释字段对吧?我来给你写个Python的实现方案,完美达到你要的扁平化列表效果:

实现思路简述

核心逻辑就是把最后那个超长的CSQ字符串拆解开:先分离出CSQ=C这种前缀项,再把后面用|分隔的所有内容拆成单独的列表元素,最后和原列表的前半部分合并。

基础场景代码示例(单转录本注释)

# 原始输入列表
original_list = ['1', '13372', '.', 'G', 'C', '608.91', 'PASS', 'CSQ=C|ENSG00000223972|ENST00000456328|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|620||||||1||1|DDX11L1|HGNC|37102|processed_transcript|YES||||||||3/3|||ENST00000456328.2:n.620G>C|||||||||||||||||||,C|ENSG00000223972|ENST00000450305|Transcript|splice_region_variant&non_coding_transcript_exon_variant&non_coding_transcript_variant|412||||||1||1|DDX11L1|HGNC|37102|transcribed_unprocessed_pseudogene|||||||||5/6|||ENST00000450305.2:n.412G>C|||||||||||||||||||,C|ENSG00000223972|ENST00000515242|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|613||||||1||1|DDX11L1|HGNC|37102|transcribed_unprocessed_pseudogene|||||||||3/3|||ENST00000515242.2:n.613G>C|||||||||||||||||||,C|ENSG00000223972|ENST00000518655|Transcript|intron_variant&non_coding_transcript_variant|||||||1||1|DDX11L1|HGNC|37102|transcribed_unprocessed_pseudogene||||||||||2/3||ENST00000518655.2:n.482-31G>C|||||||||||||||||||,C||ENSR00000528767|RegulatoryFeature|regulatory_region_variant|||||||1||||||regulatory_region|||||||||||||||||||||||||||||||']

# 提取原列表前7个无需改动的元素
prefix_elements = original_list[:7]

# 处理最后一个CSQ字段
csq_raw = original_list[7]
# 只拆分一次=,避免后续内容里的=号干扰
csq_key, csq_value_part = csq_raw.split('=', 1)
# 生成第一个拆分项:CSQ=C
first_csq_item = f"{csq_key}={csq_value_part.split('|')[0]}"
# 拆分剩下所有|分隔的内容
remaining_csq_items = csq_value_part.split('|')[1:]

# 合并得到最终列表
final_list = prefix_elements + [first_csq_item] + remaining_csq_items

# 打印验证效果
print(final_list)

进阶场景:处理多转录本注释

如果你的CSQ字段里有逗号分隔的多个转录本注释(比如示例里的5组注释),想要每个转录本都以CSQ=C开头拆分,可以用下面的代码:

prefix_elements = original_list[:7]
csq_raw = original_list[7]
csq_key, csq_value_part = csq_raw.split('=', 1)

# 先按逗号拆分不同转录本的注释
transcript_csq_groups = csq_value_part.split(',')
final_csq_items = []

for group in transcript_csq_groups:
    parts = group.split('|')
    # 给每个转录本注释加上CSQ=前缀
    final_csq_items.append(f"{csq_key}={parts[0]}")
    # 添加该转录本的其余注释项
    final_csq_items.extend(parts[1:])

# 合并所有元素
final_list = prefix_elements + final_csq_items

代码说明

  1. 先把原列表前7个元素单独提取,这部分不需要修改
  2. 用split('=', 1)拆分CSQ字段,确保只拆分键值对的分隔符,不会破坏后续内容
  3. 对拆分后的内容,按|分割成独立元素,再和前缀组合成你要的格式
  4. 多转录本场景下,额外按逗号拆分每组注释,循环处理每个转录本的内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:17:10