Python函数优化求助:按规则替换DNA序列中的N碱基
DNA序列N碱基替换脚本修复
我近期重新使用Python,需要编写脚本处理一批长度相等的DNA序列,替换其中代表错误的N碱基,规则如下:
- 仅当所有输入序列的某一位置均为N时,输出序列的该位置才保留N;
- 若某序列某位置为N,其他序列对应位置有不同核苷酸(如A和T),需生成两种替换后的序列,但不能混合不同序列的信息,替换时需基于同一参考序列的碱基,而非生成所有组合。
输入输出示例
现有代码可正确处理的示例
- 输入
["ATC", "CGN", "NNN"],应返回["ATC", "CGC"] - 输入
["ACG", "TGT", "CAG"],应返回["ACG", "TGT", "CAG"] - 输入
["ATN", "GCN", "GGN"],应返回["ATN", "GCN", "GGN"]
现有代码无法正确处理的示例
- 输入
["ACN", "TGT", "NNG"],应返回['ACT', 'TGG', 'ACG', 'TGT'] - 输入
["NTA", "GNC", "CGN"],应返回["GTA", "CTA", "GGC", "GTC", "CGA"] - 输入
["NNA", "CNN", "NGN"],应返回['NNA', 'CNN', 'NGN'] - 输入
["ACN", "TNT", "NNG"],应返回['ACT', 'ACG', 'TCT', 'ACG'](TCG为无效选项,因混合了不同序列的信息)
当前实现代码
import numpy as np def procesar_secuencias(secuencias): output = [] secuencias_con_n = [s for s in secuencias if 'N' in s] # check if there are N's if len(secuencias_con_n) == 0: # If there are no N's, simply return the sequences as is return secuencias a = [] # positions and nt b = [] for i in range(len(secuencias)): # for all sequences for j,k in enumerate(secuencias[i]): # j is position, k is nt if k != 'N': # if it not an N, save the information a.append(k) b.append(j) for s in secuencias: # for all sequences, ie [ATC, CGN, NNN] if 'N' in s: # only if s has N's inside posiciones_n = [i for i, c in enumerate(s) if c == 'N'] # save the position of the N if len(posiciones_n) == len(s): # if there are only N's, go to the next sequence break else: new_seqs = [] for h in b: # for every "valid" option for u in posiciones_n: # for all positions that store an N if h == u: # when there is an available option to change an N for a "valid" nt new_seq = s.replace(s[h], a[u]) # replace said position for a new nt new_seqs.append(new_seq) output.extend(new_seqs) else: # If there are no N's, append directly to the output. output.append(s) return np.unique(output)
问题分析
当前代码在处理如["ACN", "TGT", "NNG"]这类输入时,输出为['AAG' 'ACT' 'CCG' 'TGT'],不符合预期。问题根源在于:
- 两层循环的逻辑错误,没有基于完整的参考序列来替换目标序列中的所有N,而是逐个位置单独替换,导致混合不同参考序列的碱基;
replace方法的使用不当,会替换序列中所有匹配的字符,而非指定位置的字符。
需要修复逻辑,确保替换时基于完整的参考序列生成新序列,避免混合不同序列的信息。
内容的提问来源于stack exchange,提问作者JuanMacD
相关产品推荐
相关产品推荐

