统计ORF中各密码子出现次数的count_codons函数如何修改
count_codons函数修正方案
你现有代码存在4处需要调整的问题:
- 缺少全密码子初始化逻辑:预期输出包含所有64种标准密码子,原代码只会将切割得到的密码子加入字典,未出现的密码子不会出现在结果中,需要提前生成所有可能的密码子并将初始值设为0
- 新密码子赋值逻辑错误:第一次遍历到命中的密码子时,原代码赋值为0,正确应该赋值为1(当前已经命中1次)
- 语法兼容性问题:
has_key()是Python 2的字典方法,Python 3已废弃该语法,应该用codon in dict_codons判断是否存在 - 缺少返回值:函数末尾没有返回结果字典,调用后无法得到输出
修正后的完整代码如下(假设你的split_codons函数可以正确将ORF序列按3个碱基为单位切割为密码子列表):
# 先生成所有标准密码子列表用于初始化 def generate_all_codons(): bases = ['A', 'T', 'C', 'G'] all_codons = [] for b1 in bases: for b2 in bases: for b3 in bases: all_codons.append(b1 + b2 + b3) return all_codons def count_codons(seq): split = split_codons(seq) # 初始化所有密码子计数为0 dict_codons = {codon:0 for codon in generate_all_codons()} # 遍历计数 for codon in split: if codon in dict_codons: dict_codons[codon] += 1 return dict_codons # 测试调用 print(count_codons('ATGTCATCATGA'))
如果你的split_codons函数还未实现,可以用下面的代码补充:
def split_codons(orf_seq): # 按3个碱基为单位切割,自动忽略不足3位的尾部碱基 return [orf_seq[i:i+3] for i in range(0, len(orf_seq), 3)]
内容的提问来源于stack exchange,提问作者Lilly001
相关产品推荐
相关产品推荐

