Python氨基酸单字母码转三字母码及链编号代码问题排查
氨基酸编码转换代码问题修复
需求说明
- 输入为存储单字母氨基酸编码的字符串,例如
'GPHMAQGTLI' - 按字符原有顺序,将每个单字母氨基酸编码转换为对应的三字母编码
- 为每个氨基酸匹配指定区间(如参考区间300-309、测试区间250-254)内顺序递增的链编号
- 按顺序输出「三字母编码+链编号」的组合结果
现存问题
当前编写的代码运行后仅能输出第一个结果GLY250,无法输出全部顺序排列的结果,问题代码如下:
d = {'CYS': 'C', 'ASP': 'D', 'SER': 'S', 'GLN': 'Q', 'LYS': 'K', 'ILE': 'I', 'PRO': 'P', 'THR': 'T', 'PHE': 'F', 'ASN': 'N', 'GLY': 'G', 'HIS': 'H', 'LEU': 'L', 'ARG': 'R', 'TRP': 'W', 'ALA': 'A', 'VAL':'V', 'GLU': 'E', 'TYR': 'Y', 'MET': 'M'} def triple_aa(val, num): for key, value in d.items(): if val == value: print(key, num) def single_aa(x): for i in x: #print(i) return i def chain_no(a,b): for i in range(a,b+1,1): #print(i) return i A= single_aa('GPHMA') B= chain_no(250,254) triple_aa(A,B)
错误原因
single_aa、chain_no两个函数的return语句错误写在for循环内部,循环第一次执行就会直接终止函数返回当前值,根本不会遍历完整个氨基酸序列、整个编号区间:- 执行
single_aa('GPHMA')时,第一次循环取到第一个字符'G'就直接返回,后续的P/H/M/A完全不会被处理 - 执行
chain_no(250,254)时,第一次循环取到第一个编号250就直接返回,后续的251/252/253/254完全不会生成
- 执行
triple_aa函数仅设计为接收单个氨基酸、单个编号做处理,没有实现逐位配对遍历氨基酸和对应编号的逻辑
修正方案
首先反转原有氨基酸字典,把「三字母:单字母」的结构改成「单字母:三字母」,查询时不用每次循环遍历字典,效率更高;之后直接逐位配对氨基酸序列和编号区间的每个值,拼接输出即可。修正后代码如下:
# 构建单字母转三字母的氨基酸查询字典 aa_map = {v: k for k, v in { 'CYS': 'C', 'ASP': 'D', 'SER': 'S', 'GLN': 'Q', 'LYS': 'K', 'ILE': 'I', 'PRO': 'P', 'THR': 'T', 'PHE': 'F', 'ASN': 'N', 'GLY': 'G', 'HIS': 'H', 'LEU': 'L', 'ARG': 'R', 'TRP': 'W', 'ALA': 'A', 'VAL':'V', 'GLU': 'E', 'TYR': 'Y', 'MET': 'M' }.items()} def convert_aa(seq, start_id, end_id): # 校验序列长度和编号区间长度一致,避免错位 seq_len = len(seq) id_range_len = end_id - start_id + 1 if seq_len != id_range_len: raise ValueError(f"序列长度({seq_len})和编号区间长度({id_range_len})不匹配") result = [] # 逐位配对单字母氨基酸、递增链编号 for single_aa, chain_id in zip(seq, range(start_id, end_id + 1)): triple_code = aa_map[single_aa] item = f"{triple_code}{chain_id}" result.append(item) print(item) return result # 测试用例:序列GPHMA对应编号250-254 convert_aa('GPHMA', 250, 254)
运行结果
GLY250 PRO251 HIS252 MET253 ALA254
注:原问题描述中给出的期望输出仅列到
MET253,是因为原代码逻辑错误仅传入了第一个氨基酸和第一个编号,5位长度的序列GPHMA对应250-254共5个编号,实际完整输出包含最后一位ALA254。
内容的提问来源于stack exchange,提问作者shivam
相关产品推荐
相关产品推荐

