【问题标题】:Determining if a sequence is a valid DNA sequence确定一个序列是否是有效的 DNA 序列
【发布时间】:2015-02-01 23:25:48
【问题描述】:

我正在尝试编写这个程序,它按序列读取一个名为sequence 的字符串变量,并确定sequence 是否包含有效的DNA 序列。 我想使用一个 for 和一个 if-elif-elsestatement 来确定序列是否是有效的 DNA。
这是我到目前为止所写的:

sequence = input("Please enter a sequence: ").upper()
valid_dna = "ACGT"
sequence = sequence.replace(" ", "")

common=0
for eachletter in sequence:
    if eachletter in valid_dna:
        common +=1

print("This is a valid dna sequence")

elif sequence != valid_dna:
    print("This is not a valid DNA sequence")

else:
    print()

我不知道在elif 之后添加什么,因为我在elif 之后添加的内容返回Syntax error

我原来有

sequence = input().upper()
sequence= input("Please enter a sequence:  ")

哪方面配合不好,感谢 VHarisop 指出!

更新: 这就是我现在所拥有的,并且有效!

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("This is a valid DNA sequence.") 
else:
    print("This is an invalid DNA sequence")

【问题讨论】:

  • 它有什么作用 - 重要的是要知道你得到了什么行为。

标签: python if-statement python-3.x for-loop dna-sequence


【解决方案1】:

我只会使用all 和生成器表达式

>>> valid = 'ACTG'

>>> s1 = 'ATAGCGGCAT'
>>> all(i in valid for i in s1)
True

>>> s2 = 'ABCDEFHI'
>>> all(i in valid for i in s2)
False

如果您必须使用for 循环和if 语句,因为这是作业要求,您可以使用类似的想法

def validSequence(s):
    valid = 'ACTG'
    for letter in s:
        if letter not in valid:
            return False
    return True

>>> validSequence('ATAGCGGCAT')
True
>>> validSequence('ABCDEFHIJK')
False

【讨论】:

    【解决方案2】:

    首先,你有:

    sequence = input().upper()
    # irrelevant code
    sequence= input("Please enter a sequence:  ")
    

    这将要求输入两次,第一次将您输入的所有内容都转换为大写,第二次则保持不变,这显然会导致错误行为。我建议只保留:

    sequence = input('Please enter a sequence: ').upper()
    

    然后使用生成器表达式来检查有效性。

    实际上,没有必要为无效字符保留单独的字符串。做吧:

    valid_dna = 'ACGT'
    sequence = input('Please enter a sequence: ').upper()
    
    # will print True if every character in the sequence belongs to valid_dna
    print(all(i in valid_dna for i in sequence))
    

    这里,生成器表达式(i in valid_dna for i in sequence) 将为序列中属于valid_dna 的每个字符返回True,为不属于valid_dna 的每个字符返回False。仅当表达式生成的每个值都为 True 时,内置函数 any() 才会返回 True。

    如果您想要正确的消息,您可以简单地检查表达式的返回值并相应地打印:

    condition = all(i in valid_dna for i in sequence)
    print('Valid sequence') if condition else print('Invalid sequence')
    

    【讨论】:

    • 如果我在我的sequence 中添加空格,那么它将打印Invalid sequence,如果我希望它仍然打印真(带空格),我应该添加sequence= sequence.strip(' ')吗?
    • 哦,没关系,我添加了sequence = sequence.replace(" ", ""),它去掉了所有的空白!
    【解决方案3】:
    def is_valid_sequence(dna):
        char_invalid = ''
        for char in dna:
            if char not in 'ATCG':
                char_invalid = char_invalid + char
        return not bool (char_invalid)
    

    【讨论】:

    • 纯代码答案可能会解决问题,但如果您解释它们如何解决问题,它们会更有用。社区需要理论和代码才能完全理解您的答案。
    猜你喜欢
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多