如何使用分隔符拆分列表中的复合字符串元素并重组列表
拆分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
代码说明
- 先把原列表前7个元素单独提取,这部分不需要修改
- 用
split('=', 1)拆分CSQ字段,确保只拆分键值对的分隔符,不会破坏后续内容 - 对拆分后的内容,按
|分割成独立元素,再和前缀组合成你要的格式 - 多转录本场景下,额外按逗号拆分每组注释,循环处理每个转录本的内容
内容的提问来源于stack exchange,提问作者Ilse
相关产品推荐
相关产品推荐

