如何修复DNA基因片段验证代码,实现相邻重复字符检测?
修复DNA基因片段有效性验证的Python代码
作业要求:DNA序列由codon组成,codon是{A,C,G,T}中3个不同字母的组合,例如ACT、ACG等;基因片段是由至少3个codon组成的序列,需以ATG开头,以TAA、TAG或TGA结尾,需编写程序验证基因片段是否有效。
本人编写的Python代码如下:
sequence = input().upper() valid_dna = "ACGT" sequence = sequence.replace(" ", "") for i in sequence: if i in valid_dna: count = 1 else: count=0 if count==1: print("YES") else: print("NO")当前代码对输入的A、C、G、T字符均返回“YES”,但无法在出现相邻重复字符时返回“NO”,同时想了解如何检测两个相邻字符是否重复,请问该如何修复代码?
你的原代码仅做了单个字符的合法性判断,完全没覆盖作业要求的基因片段规则,下面是修复后的代码及关键逻辑说明:
def is_valid_gene(sequence): # 预处理:统一格式,去除空格和首尾空白字符 sequence = sequence.strip().upper().replace(" ", "") valid_nucleotides = {"A", "C", "G", "T"} stop_codons = {"TAA", "TAG", "TGA"} start_codon = "ATG" # 1. 序列长度必须是3的倍数(每个codon占3个字符) if len(sequence) % 3 != 0: return False # 2. 至少包含3个codon,对应序列长度≥9 if len(sequence) < 9: return False # 3. 校验起始密码子 if not sequence.startswith(start_codon): return False # 4. 校验终止密码子 if sequence[-3:] not in stop_codons: return False # 遍历每个codon做细节校验 for i in range(0, len(sequence), 3): codon = sequence[i:i+3] # 检查codon的每个字符都是合法核苷酸 for nt in codon: if nt not in valid_nucleotides: return False # 检查codon内部3个字符互不重复(满足作业对codon的要求) if len(set(codon)) != 3: return False # 额外:检查codon内部的相邻字符重复(和上面的set判断效果一致,可选) # if codon[0] == codon[1] or codon[1] == codon[2]: # return False # 如果需要检查跨codon的相邻重复(比如前一个codon末尾和后一个codon开头重复) if i != len(sequence) - 3: if codon[-1] == sequence[i+3]: return False return True # 主程序调用 input_seq = input("请输入基因片段:") print("YES" if is_valid_gene(input_seq) else "NO")
关键修复点说明
整体结构校验:
- 先判断序列长度是否为3的倍数,确保能完整分割为codon
- 校验序列长度至少为9(对应3个codon)
- 验证开头是
ATG、结尾是指定的终止密码子
codon有效性校验:
- 确保每个codon的字符都是
A/C/G/T - 通过
len(set(codon)) != 3快速判断codon内部是否有重复字符(集合自动去重,长度不为3说明存在重复)
- 确保每个codon的字符都是
相邻重复检测:
- 若仅需检查codon内部的相邻重复,上面的set判断已经足够
- 若需要检查整个序列中任意相邻字符(包括跨codon的情况),添加循环里的跨codon判断即可
内容的提问来源于stack exchange,提问作者XBeng
相关产品推荐
相关产品推荐

