Как проверить все символы в цикле for с логическим типом?

Мне нужно написать функцию, которая возвращает True тогда и только тогда, когда последовательность ДНК не содержит символов, кроме «A», «T», «C» и «G»)

Вот мой код, который вызывает этот тип ошибки: объект 'str' не поддерживает назначение элементов

def is_valid_sequence(dna):
    i = 0
    for dna[i] in dna:
        if dna[i] in 'ATCG':
            i = i +1
            return True
        else:
            return False

Я создал другой код для той же цели, но он проверяет только первый символ в последовательности, и я понятия не имею, как заставить цикл проверять следующие символы.

def is_valid_sequence(dna):
    i = 0
    for char in dna:
        if char in 'ATCG':
            i = i +1
            return True
        else:
            return False

person Daria Ivanova    schedule 20.06.2016    source источник
comment
Проблема, с которой вы столкнулись, должна указывать вам точно на проблему; подумайте о том, когда ваша функция вернется. Что касается первой версии, вы должны были использовать while i < len(dna) в качестве цикла, так как вы не можете назначить dna[i], но for над символами более Pythonic.   -  person jonrsharpe    schedule 21.06.2016


Ответы (2)


Там очень простое решение этой проблемы на питоне:

def is_valid_sequence(dna):
    return all(c in 'ATCG' for c in dna.upper())

Это проверит каждую букву и не заботится о регистре ввода.

all() принимает итерацию и возвращает True только в том случае, если каждый элемент правдив. Поскольку c in 'ATCG' возвращает логическое значение, это очень чистое решение.

person Anonymous    schedule 20.06.2016
comment
спасибо! Не могли бы вы объяснить, почему мой первый код вызывает эту ошибку — объект «str» не поддерживает назначение элементов? - person Daria Ivanova; 21.06.2016
comment
Первая строка цикла — это задача: for dna[i] in dna. На первой итерации он оценивает его как dna[0] = dna[0], чего вы не можете сделать, потому что dna является строкой и не может быть изменена. - person Anonymous; 21.06.2016
comment
is_valid_sequence('') возвращает True - person Mike Müller; 21.06.2016
comment
Да, и это удовлетворяет тогда и только тогда, когда последовательность ДНК не содержит символов, кроме требований «A», «T», «C» и «G». - person Anonymous; 21.06.2016

Предоставленный вами код имеет некоторые недостатки в цикле, в целом цикл будет выполняться для символов, и итерация происходит для переменной, которую вы установили в цикле for, приращение i во втором фрагменте не используется в вашем коде. Точно так же вместо dna[i] подойдет только for i in dna.

В вашем случае я бы предложил что-то с точки зрения наборов -

Допустим, dna - это ваша строка с прописными буквами.

permitted_characters = "ATCG"
set(dna).issubset(set(permitted_characters))

Это вернет True и False в соответствии с вашим набором требований, чтобы разбить строку на неповторяющийся набор алфавитов.

person minocha    schedule 20.06.2016