Python实现:从氨基酸序列比对结果获取目标序列对应有效索引
参考序列索引到目标序列索引映射实现
已知条件
- 参考序列:
SCAASGGSEYGTLVTVSSRGRHHHHHH - 目标序列:
SCAASVRGTQVTVSSGPGGQHHHHHH - 序列比对结果(
-表示插入空位):
SCAASGGSEYGTLVTVSSR--GRHHHHHH SCAAS---VRGTQVTVSSGPGGQHHHHHH
功能要求
输入比对前的参考序列索引列表,查询其对应到比对前的目标序列的索引,若比对结果中参考索引对应位置的目标序列字符为插入空位-则忽略该条记录,最终输出过滤后的有效索引列表。
示例:
输入参考序列索引:[0, 5, 20]
对应参考序列氨基酸:['S', 'G', 'R']
比对后对应目标序列字符:['S', '-', 'Q']
对应目标序列原始索引:[0, 'N/A', 19]
最终输出有效索引列表:[0, 19]
Python实现代码
def map_ref_index_to_target(ref_align: str, target_align: str, ref_indices: list[int]) -> list[int]: # 构建参考原始索引到比对位置的映射 ref_ori_to_align = {} current_ref_idx = 0 for align_pos, char in enumerate(ref_align): if char != "-": ref_ori_to_align[current_ref_idx] = align_pos current_ref_idx += 1 # 构建比对位置到目标原始索引的映射 align_to_target_ori = {} current_target_idx = 0 for align_pos, char in enumerate(target_align): if char != "-": align_to_target_ori[align_pos] = current_target_idx current_target_idx += 1 # 筛选有效映射结果 result = [] for ref_idx in ref_indices: if ref_idx not in ref_ori_to_align: continue align_pos = ref_ori_to_align[ref_idx] if align_pos in align_to_target_ori: result.append(align_to_target_ori[align_pos]) return result # 功能测试 if __name__ == "__main__": ref_align = "SCAASGGSEYGTLVTVSSR--GRHHHHHH" target_align = "SCAAS---VRGTQVTVSSGPGGQHHHHHH" input_indices = [0, 5, 20] print(map_ref_index_to_target(ref_align, target_align, input_indices)) # 运行输出:[0, 19]
内容的提问来源于stack exchange,提问作者lanselibai
相关产品推荐
相关产品推荐

