Похоже, вы взяли какой-то код и попытались использовать его, даже не понимая, что он делает. Если вы прочитаете связанный вопрос , вы заметите, что у автора этого вопроса был словарь строк аминокислотных кодов, разделенных |
. Вызов split
должен был извлечь вторую часть каждой строки кода, например, из "F|Phe"
вы хотите получить "Phe"
, и поэтому этому постеру понадобился split
. У вас нет таких строк, поэтому вы не должны использовать эту часть кода.
Я буду второй рекомендацией Хоакина использовать BioPython, поскольку это, безусловно, правильный инструмент для работы, но для целей обучения: первое, что вам нужно знать, это то, что у вас есть четыре задачи для выполнения:
- Вычислить обратный комплемент последовательности оснований ДНК
- Разбить обратную комплементарную последовательность на группы по 3 основания
- Конвертировать каждую группу в код аминокислоты
- Соедините коды аминокислот в строку
Код в связанном ответе не обрабатывает первый шаг. Для этого вы можете использовать метод translate
строковых объектов Python. Сначала вы используете maketrans
для создания словаря перевода, который отобразит ключ => значение,
basecomplement = str.maketrans({'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'})
и затем вы можете написать метод для получения обратного дополнения,
def reverse_complement(seq):
return seq.translate(basecomplement)[::-1]
Метод translate
ответа Хоакина на другой вопрос реализует шаги 2 и 3. На самом деле это можно сделать более эффективно, используя рецепт grouper
из itertools
. Сначала вам понадобится словарь, отображающий базовые триплеты на аминокислоты,
amino_acids = {'TAT': 'Tyr', ...}
и затем вы можете использовать это для преобразования любой последовательности оснований,
amino_acids[''.join(a)] for a in zip(*([iter(rseq)]*3))
В порядке пояснения zip(*([iter(rseq)]*3))
группирует по три символа за раз. Но это как кортежи, а не строки, например для 'TATATA'
вы получите ('T', 'A', 'T'), ('A', 'T', 'A')
, поэтому вам нужно присоединиться к каждому кортежу, чтобы создать строку. Вот что делает ''.join(a)
. Затем вы ищите строку в таблице аминокислот, которая выполняется с помощью amino_acids[...]
.
Наконец, вам нужно объединить все полученные коды аминокислот вместе, что можно сделать с помощью внешнего ''.join(...)
. Таким образом, вы можете определить метод следующим образом:
def to_amino_acids(seq):
return ''.join(amino_acids[''.join(a)] for a in zip(*([iter(rseq)]*3)))
Обратите внимание, что вам не нужно .split('|')
, если ваш словарь amino_acids
не содержит несколько представлений, разделенных |
.
Наконец, чтобы сделать это для трех различных способов преобразования оснований в аминокислоты, то есть для трех кадров, вы должны использовать что-то похожее на последний цикл в ответе Хоакина,
rseq = reverse_complement(seq)
for frame in range(3):
# print the frame number
print('+', frame+1, end=' ')
# translate the base sequence to amino acids and print it
print(to_amino_acids(rseq[frame:]))
Обратите внимание, что этот цикл выполняется три раза, чтобы напечатать три разных кадра. Нет смысла иметь цикл, если вы просто собираетесь запустить его один раз.