Как сделать так, чтобы по умолчанию в Python использовались только явные символы из данного списка? - PullRequest
1 голос
/ 17 апреля 2020

Я пытаюсь написать небольшой код, используя «def», чтобы создать свою собственную функцию в Python. Эта функция проверяет, является ли строка, предоставленная пользователем, последовательностью ДНК или нет. Поскольку ДНК может состоять только из кислот, сокращенно обозначенных как A, C, G, T, моя функция должна принимать только строки, состоящие из этих букв, и возвращать True, в противном случае она должна возвращать False. Мой код делает это до некоторой степени, но в некоторых случаях, таких как 'ACGTGATTCGF' или 'CGGCGAACCACCaxCCAzAatccG' или '' ', он возвращает True вместо False. Я не понимаю, почему. Вот код:

def is_this_dna(sequence):
    acids = ["A", "C", "G", "T"]
    for c in sequence:
        if c in acids:
            return True
        else:
            return False

#code driver
my_dna = str(input("Enter your DNA sequence:"))

print(is_this_dna(my_dna))

Ответы [ 3 ]

1 голос
/ 17 апреля 2020

Проблема вашего кода в том, что вы проверяете только первый символ. После проверки вы вернетесь в обоих случаях.

Попробуйте вместо этого:

def is_this_dna(sequence):
    acids = ["A", "C", "G", "T"]
    for c in sequence:
        if c not in acids:
            return False
    return True and len(sequence)>0

В этом коде вы вернете True только после того, как проверили все символы и последовательность не пустая строка.

Другое решение может быть:

def is_this_dna(sequence):
    acids = ["A", "C", "G", "T"]
    return len(sequence)>0 and all([c in acids for c in sequence])
1 голос
/ 17 апреля 2020

Вместо этого можно сделать набор acids, чтобы проверить, является ли он надмножеством входной последовательности:

def is_this_dna(sequence):
    return {"A", "C", "G", "T"}.issuperset(sequence)
1 голос
/ 17 апреля 2020

Это потому, что вы возвращаете True сразу же, как только вы найдете один из символов кислот в вашей строке перед проверкой всех элементов

Что-то вроде этого должно работать.

def is_this_dna(sequence):
   acids = ["A", "C", "G", "T"]
   return all(c in acids for c in sequence)

Может быть другая версия. (Я думаю, что первый более идиоматический c хотя)

def is_this_dna(sequence):
   acids = ["A", "C", "G", "T"]
   for c in sequence:
       if c not in acids:
           return False
   return True

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...