Python列表追加列表方法咨询及VCF处理代码问题排查求助
列表拼接与VCF解析代码问题排查
基础需求
需要将listB的元素追加到listA中,得到合并后的新列表:
输入示例
listA = [[a,b],[c,d],[e,f]] listB = [[g,h],[i,j]]
期望输出
sum_list = [[a,b],[c,d],[e,f],[g,h],[i,j]]
该基础需求实现非常简单,直接用列表拼接语法即可:
sum_list = listA + listB,或者直接修改listA本身:listA.extend(listB)
待排查的VCF解析代码问题
用户附带的VCF注释提取代码存在多处问题,具体如下:
- 缩进错误:最外层
for line in vcf_file循环下的第一行match = []没有对应缩进,和循环属于同一层级,每轮循环不会正确初始化match列表,逻辑完全混乱 - 无意义循环:
for one in GENE属于逻辑错误,GENE是提取到的单个基因名字符串,遍历会逐个取出基因名的单个字符,且每次循环都重新初始化tmp列表,最终tmp只会保留最后一次循环生成的内容,前面的全部丢失 - 作用域错误:tmp在遍历GENE的循环内定义,循环外执行
match.extend(tmp)只能拿到最后一次循环的tmp值,有效数据全部丢失 - 场景遗漏:当前逻辑只处理了ANN字段有多个注释(即逗号分割后长度>1)的情况,单注释的记录会被直接忽略,导致数据缺失
- 代码冗余:同一条line反复执行split('\t')、split('ANN=')操作,既降低运行效率,也容易触发索引越界异常
# 初始问题代码 for line in vcf_file: match = [] CHROM = line.split('\t')[0] POS = line.split('\t')[1] REF = line.split('\t')[3] ALT = line.split('\t')[4] VEP = line.split('ANN=')[1].split('|')[1] ANN = line.split('ANN=')[1].split(';')[0] if len(ANN.split(',')) > 1 : for i in ANN.split(','): GENE, HGVS = i.split('|')[3], i.split('|')[10] for one in GENE: tmp=[] tmp.append(sampleNo) tmp.append(GENE) tmp.append(CHROM) tmp.append(POS) tmp.append(REF) tmp.append(ALT) tmp.append(VEP) match.extend(tmp)
问题解决更新
用户已自行调整代码修复问题,通过新增中间列表执行extend操作完成需求,最终可用代码如下:
for line in vcf_file: match = [] CHROM = line.split('\t')[0] POS = line.split('\t')[1] REF = line.split('\t')[3] ALT = line.split('\t')[4] VEP = line.split('ANN=')[1].split('|')[1] VEP_impact = line.split('ANN=')[1].split('|')[2] REF_DP = line.split('\t')[9].split(':')[1].split(',')[0] ALT_DP = line.split('\t')[9].split(':')[1].split(',')[1] AF = line.split('\t')[9].split(':')[2] ANN = line.split('ANN=')[1].split(';')[0] if len(ANN.split(',')) > 1 : for i in ANN.split(','): GENE, HGVS = i.split('|')[3], i.split('|')[10] ann = [] for one in GENE: tmp = [] tmp.append(sampleNo) tmp.append(GENE) tmp.append(CHROM) tmp.append(POS) tmp.append(REF) tmp.append(ALT) tmp.append(VEP) tmp.append(VEP_impact) tmp.append(REF_DP) tmp.append(ALT_DP) tmp.append(AF) ann.extend(tmp) match.extend(ann)
内容的提问来源于stack exchange,提问作者union
相关产品推荐
相关产品推荐

