问题:在一串序列中,提取某些特定序列的位置
样例:在一串序列CAGTCATGCATCGTAGTC
中找出所有的短序列CAG
的位置
样例输出:{'CAG': [0]}
代码实现
from typing import Dict, List def get_target_seq_position(sequence, target_sequence): """ 获取target_sequence在sequence中的位置 """ # 结果 result: Dict[str, List] = {} # 序列长度 slen = len(sequence) for target in target_sequence: # 首先初始化target的结果 # 方便后面将sequence中所有和target匹配的位置都保存下来 result[target] = [] # target长度 tlen = len(target) # 当前匹配到的位置 offset = 0 # 最大的匹配位置 max_offset = slen - tlen + 1 for index in range(max_offset): # 如果 当前匹配位置为最大匹配位置 # 就结束循环 if offset == max_offset: break # 开始匹配 if sequence[index:index+tlen] == target: # 匹配上了以后 # 这里就直接跳到下一个可能的匹配位置 offset += tlen # 保存当前匹配的位置 result[target].append(index) else: # 没有匹配上就往后挪一位 offset += 1 return result
代码测试
if __name__ == '__main__': # 初始序列 # 下面是字符串的换行写法 sequence = ( 'CAGTCATGCATCGTAGTC' 'ATCTACTATCTAGCATCT' 'AGCTATCTAGCTATCATTG' 'ATGCATGTACT' ) # 模拟target target_sequence = ['TTTAGGG', 'CCCTAAA'] # 模拟含有target的sequence # 这里添加了三个target序列 sequence = ( sequence[:10] + target_sequence[0] + # target序列 target_sequence[0] + # target序列 sequence[10:] + target_sequence[1] # target序列 ) result = get_target_seq_position( sequence, target_sequence ) # 根据结果匹配出来的位置检查对应的序列是否与target相同 for target, target_postion in result.items(): tlen = len(target) for p in target_postion: print( p, target, target==sequence[p:p+tlen] )