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

如何修复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")

关键修复点说明

  1. 整体结构校验:

    • 先判断序列长度是否为3的倍数,确保能完整分割为codon
    • 校验序列长度至少为9(对应3个codon)
    • 验证开头是ATG、结尾是指定的终止密码子
  2. codon有效性校验:

    • 确保每个codon的字符都是A/C/G/T
    • 通过len(set(codon)) != 3快速判断codon内部是否有重复字符(集合自动去重,长度不为3说明存在重复)
  3. 相邻重复检测:

    • 若仅需检查codon内部的相邻重复,上面的set判断已经足够
    • 若需要检查整个序列中任意相邻字符(包括跨codon的情况),添加循环里的跨codon判断即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:26:03