Предполагая, что в ожидаемом результате есть опечатка, и она на самом деле должна быть /52MOErT/*/i2MOErG/*/i2MOErT/*A*C*G*T*T*G*C*T*C*C*/i2MOErG/*/i2MOErA/*/32MOErC/
, сработает приведенный ниже код:
# python3
def encode_sequence(seq):
seq_front = seq[:3]
seq_back = seq[-3:]
seq_middle = seq[3:-3]
front_ix = ["/52MOEr{}/", "/i2MOEr{}/", "/i2MOEr{}/"]
back_ix = ["/i2MOEr{}/", "/i2MOEr{}/", "/32MOEr{}/"]
encoded = []
for base, index in zip(seq_front, front_ix):
encoded.append(index.format(base))
encoded.extend(seq_middle)
for base, index in zip(seq_back, back_ix):
encoded.append(index.format(base))
return "*".join(encoded)
Прочитайте код и убедитесь, что вы его понимаете. По сути, мы просто нарезаем исходную строку и вставляем базы в нужный вам формат. Каждый элемент окончательного вывода добавляется в список и соединяется символом *
в конце.
Если вам нужно динамически указать номер и название баз, которые вы извлекаете из передней и задней частейпоследовательность вы можете использовать эту версию. Обратите внимание, что фигурные скобки {}
сообщают функции string.format
, куда вставлять базу.
def encode_sequence_2(seq, front_ix, back_ix):
seq_front = seq[:len(front_ix)]
seq_back = seq[-len(back_ix):]
seq_middle = seq[len(front_ix):-len(back_ix)]
encoded = []
for base, index in zip(seq_front, front_ix):
encoded.append(index.format(base))
encoded.extend(seq_middle)
for base, index in zip(seq_back, back_ix):
encoded.append(index.format(base))
return "*".join(encoded)
А вот вывод:
> seq = "TGTACGTTGCTCCGAC"
> encode_sequence(seq)
/52MOErT/*/i2MOErG/*/i2MOErT/*A*C*G*T*T*G*C*T*C*C*/i2MOErG/*/i2MOErA/*/32MOErC/
Если у вас есть список последовательностей дляКодировать вы можете перебирать список и кодировать каждый:
encoded_list = []
for seq in dna_list:
encoded_list.append(encode_sequence(seq))
Или с пониманием списка:
encoded_list = [encode_sequence(seq) for seq in dna_list)]