Python处理密码子字典:生成去重氨基酸列表等问题求助
密码子编码字典处理问题解决方案
问题背景
给定密码子编码字典:
gencode = { 'ATA':'I', 'ATC':'I', 'ATT':'I', 'ATG':'M', 'ACA':'T', 'ACC':'T', 'ACG':'T', 'ACT':'T', 'AAC':'N', 'AAT':'N', 'AAA':'K', 'AAG':'K', 'AGC':'S', 'AGT':'S', 'AGA':'R', 'AGG':'R', 'CTA':'L', 'CTC':'L', 'CTG':'L', 'CTT':'L', 'CCA':'P', 'CCC':'P', 'CCG':'P', 'CCT':'P', 'CAC':'H', 'CAT':'H', 'CAA':'Q', 'CAG':'Q', 'CGA':'R', 'CGC':'R', 'CGG':'R', 'CGT':'R', 'GTA':'V', 'GTC':'V', 'GTG':'V', 'GTT':'V', 'GCA':'A', 'GCC':'A', 'GCG':'A', 'GCT':'A', 'GAC':'D', 'GAT':'D', 'GAA':'E', 'GAG':'E', 'GGA':'G', 'GGC':'G', 'GGG':'G', 'GGT':'G', 'TCA':'S', 'TCC':'S', 'TCG':'S', 'TCT':'S', 'TTC':'F', 'TTT':'F', 'TTA':'L', 'TTG':'L', 'TAC':'Y', 'TAT':'Y', 'TAA':'_', 'TAG':'_', 'TGC':'C', 'TGT':'C', 'TGA':'_', 'TGG':'W' }
需求
- a) 生成字典中单字母编码列表
aas,每个编码仅出现一次,将终止密码子_替换为* - b) 对
aas按字母顺序排序 - c) 为每个单字母编码展示关联密码子,输出格式:
A: nnn mmm(A为单字母编码,nnn/mmm为密码子)
遇到的问题
尝试的代码无法将列表中的_替换为*,无论直接操作列表还是转字符串替换都无效,尝试的代码如下:
gencode = { 'ATA':'I', 'ATC':'I', 'ATT':'I', 'ATG':'M', 'ACA':'T', 'ACC':'T', 'ACG':'T', 'ACT':'T', 'AAC':'N', 'AAT':'N', 'AAA':'K', 'AAG':'K', 'AGC':'S', 'AGT':'S', 'AGA':'R', 'AGG':'R', 'CTA':'L', 'CTC':'L', 'CTG':'L', 'CTT':'L', 'CCA':'P', 'CCC':'P', 'CCG':'P', 'CCT':'P', 'CAC':'H', 'CAT':'H', 'CAA':'Q', 'CAG':'Q', 'CGA':'R', 'CGC':'R', 'CGG':'R', 'CGT':'R', 'GTA':'V', 'GTC':'V', 'GTG':'V', 'GTT':'V', 'GCA':'A', 'GCC':'A', 'GCG':'A', 'GCT':'A', 'GAC':'D', 'GAT':'D', 'GAA':'E', 'GAG':'E', 'GGA':'G', 'GGC':'G', 'GGG':'G', 'GGT':'G', 'TCA':'S', 'TCC':'S', 'TCG':'S', 'TCT':'S', 'TTC':'F', 'TTT':'F', 'TTA':'L', 'TTG':'L', 'TAC':'Y', 'TAT':'Y', 'TAA':'_', 'TAG':'_', 'TGC':'C', 'TGT':'C', 'TGA':'_', 'TGG':'W'} aas = [] for val in gencode.values(): aas.append([val]) aas.sort() aas1 = [] for i in aas: if i not in aas1: aas1.append(i) a = str(aas1) a.replace('[_]', '*') print(a)
解决方案
原代码问题分析
- 错误地将每个氨基酸编码包装成列表(
append([val])),导致后续处理的是嵌套列表而非字符串 str.replace()返回新字符串,原字符串不会被修改,未将替换结果重新赋值给变量- 去重和排序逻辑放在循环内部,效率低且易出错
完整实现代码
gencode = { 'ATA':'I', 'ATC':'I', 'ATT':'I', 'ATG':'M', 'ACA':'T', 'ACC':'T', 'ACG':'T', 'ACT':'T', 'AAC':'N', 'AAT':'N', 'AAA':'K', 'AAG':'K', 'AGC':'S', 'AGT':'S', 'AGA':'R', 'AGG':'R', 'CTA':'L', 'CTC':'L', 'CTG':'L', 'CTT':'L', 'CCA':'P', 'CCC':'P', 'CCG':'P', 'CCT':'P', 'CAC':'H', 'CAT':'H', 'CAA':'Q', 'CAG':'Q', 'CGA':'R', 'CGC':'R', 'CGG':'R', 'CGT':'R', 'GTA':'V', 'GTC':'V', 'GTG':'V', 'GTT':'V', 'GCA':'A', 'GCC':'A', 'GCG':'A', 'GCT':'A', 'GAC':'D', 'GAT':'D', 'GAA':'E', 'GAG':'E', 'GGA':'G', 'GGC':'G', 'GGG':'G', 'GGT':'G', 'TCA':'S', 'TCC':'S', 'TCG':'S', 'TCT':'S', 'TTC':'F', 'TTT':'F', 'TTA':'L', 'TTG':'L', 'TAC':'Y', 'TAT':'Y', 'TAA':'_', 'TAG':'_', 'TGC':'C', 'TGT':'C', 'TGA':'_', 'TGG':'W' } # 需求a:生成去重且替换终止密码子的列表 aas = [] for val in gencode.values(): # 替换_为*后再处理 processed_val = '*' if val == '_' else val if processed_val not in aas: aas.append(processed_val) # 需求b:字母顺序排序 aas.sort() # 需求c:展示每个编码对应的密码子 # 先构建反向字典:氨基酸编码 -> 密码子列表 aa_to_codons = {} for codon, aa in gencode.items(): key = '*' if aa == '_' else aa if key not in aa_to_codons: aa_to_codons[key] = [] aa_to_codons[key].append(codon) # 按排序后的aas输出 for aa in aas: codons = ' '.join(aa_to_codons[aa]) print(f"{aa}: {codons}")
代码说明
- 需求a实现:遍历字典值时直接判断是否为
_,替换为*后再加入列表,同时做去重判断 - 需求b实现:直接调用列表的
sort()方法,默认按字母顺序排序 - 需求c实现:先构建反向字典,将每个氨基酸(或终止符)映射到对应的密码子列表,再遍历排序后的
aas输出指定格式
内容的提问来源于stack exchange,提问作者RollingThunder
相关产品推荐
相关产品推荐

