You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从现有字典提取密码子对应氨基酸并整合进Python数组?

问题分析与解决方案

你的错误出在第二个循环逻辑:AS变量保留了上一轮遍历genetic_code时的最后一个氨基酸(此处为V),导致只有属于V的密码子才会触发判断;同时genetic_code.keys()返回的是所有氨基酸的集合,而非当前密码子对应的单个氨基酸,最终输出完全不符合预期。

你既可以直接从现有字典中获取对应氨基酸,也可以构建反向字典提升查询效率,以下是两种可行方案:


方案一:直接在现有字典中查询(适合小规模序列)

在遍历密码子的过程中,同时匹配对应的氨基酸和频率,一次循环完成数据收集,逻辑更简洁:

dna_sequence = "GAGCGTCTGCTCCGTGTATAAGCCACGTCGGAGCT"
codons = [dna_sequence[i:i+3] for i in range(0, len(dna_sequence), 3)]

genetic_code = {
    "A": {"GCG" :33,"GCA" :23,"GCT" :18,"GCC" :26},       
    "R": {"AGG" :3,"AGA" :6, "CGG" :30, "CGA" :6,"CGT" :28,"CGC" :28},
    "N": {"AAT" :50,"AAC" :50},
    "D": {"GAT" :63, "GAC":27},
    "C": {"TGT" :46,"TGC" :54},
    "*": {"TGA" :25,"TAG" :25,"TAA" :50}, # * Stop codon
    "Q": {"CAG" :65,"CAA" :35},
    "E": {"GAG" :33,"GAA" :67},
    "G": {"GGG" :15,"GGA" :15,"GGT" :35,"GGC" :36},
    "H": {"CAT" :60,"CAC" :40},
    "I": {"ATA" :11,"ATT" :50,"ATC" :39},
    "L": {"TTG" :13,"TTA" :14,"CTG" :48,"CTA" :4,"CTT" :12,"CTC" :10},
    "K": {"AAG" :24,"AAA" :76},
    "M": {"ATG" :100}, # Start codon
    "F": {"TTT" :58,"TTC" :42},
    "P": {"CCG" :50,"CCA" :21,"CCT" :17,"CCC" :12},
    "S": {"AGT" :16,"AGC" :24,"TCG" :15,"TCA" :15,"TCT" :16,"TCC" :15},
    "T": {"ACG" :25,"ACA" :16,"ACT" :19,"ACC" :40},
    "W": {"TGG" :100},
    "Y": {"TAT" :59,"TAC" :41},
    "V": {"GTG" :35,"GTA" :17,"GTT" :28,"GTC" :20}
}

codonValue = []
ASseq = []

for codon in codons:
    # 跳过长度不足3的不完整密码子
    if len(codon) != 3:
        continue
    for aa, codon_dict in genetic_code.items():
        if codon in codon_dict:
            codonValue.append(codon_dict[codon])
            ASseq.append(aa)
            # 找到对应氨基酸后立即跳出循环,减少不必要的遍历
            break

# 生成包含密码子、氨基酸、频率的数组
CodonArray = list(zip(codons[:len(ASseq)], ASseq, codonValue))

print("CodonArray")
print(CodonArray)

输出结果

CodonArray
[('GAG', 'E', 33), ('CGT', 'R', 28), ('CTG', 'L', 48), ('CTC', 'L', 10), ('CGT', 'R', 28), ('GTA', 'V', 17), ('TAA', '*', 50), ('GCC', 'A', 26), ('ACG', 'T', 25), ('TCG', 'S', 15), ('GAG', 'E', 33)]

方案二:构建反向字典(适合大规模序列)

如果需要处理超长DNA序列,建议先构建一个以密码子为键、(氨基酸, 频率)为值的反向字典,后续查询可实现O(1)常数时间复杂度,大幅提升效率:

dna_sequence = "GAGCGTCTGCTCCGTGTATAAGCCACGTCGGAGCT"
codons = [dna_sequence[i:i+3] for i in range(0, len(dna_sequence), 3)]

genetic_code = {
    # 此处省略原字典内容,与方案一完全一致
}

# 预构建反向字典:密码子 → (氨基酸, 频率)
codon_map = {}
for aa, codon_dict in genetic_code.items():
    for codon, freq in codon_dict.items():
        codon_map[codon] = (aa, freq)

# 生成结果数组
CodonArray = []
for codon in codons:
    if len(codon) == 3 and codon in codon_map:
        aa, freq = codon_map[codon]
        CodonArray.append( (codon, aa, freq) )

print("CodonArray")
print(CodonArray)

输出结果

与方案一完全一致,但查询效率显著提升。


内容的提问来源于stack exchange,提问作者Oliver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:17:01