Есть ли способ заменить первые и последние три символа в списке последовательностей, используя Python? - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь использовать Python для замены определенных символов в списке последовательностей, которые будут отправлены для синтеза. Рассматриваемые символы - первые и последние три каждой последовательности. Я также пытаюсь добавить * между каждым символом.

Сложность в том, что первый и последний символы должны отличаться от двух других.

Например: последовательность ДНК TGTACGTTGCTCCGAC необходимо изменить на /52MOErT/*/i2MOErG/*/i2MOErT/*A*C*G*T*T*G*C*T*C*C*/i2MOErG/*/i2MOErA/*/32MOErC/

Первый символ должен быть / 52MOEr_ /, а последний должен быть / 32MOEr_ /, где _является символом в этом индексе. Для приведенного выше примера это будет T для первого и C для последнего. Два других, GT и GA, должны быть / i2MOEr_ / модификации.

Пока что я преобразовал последовательности в список с помощью функции .split(). Конечный результат был ['AAGTCTGGTTAACCAT', 'AATACTAGGTAACTAC', 'TGTACGTTGCTCCGTC', 'TGTAGTTAGCTCCGTC']. Я играл немного, но чувствую, что мне нужно какое-то руководство.

Разве это не так просто, как я думал?

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Вы можете просто использовать алгоритм «разделяй и властвуй». Вот мое решение для достижения вашей цели.

dna = "TGTACGTTGCTCCGAC"
dnaFirst3Chars = '/52MOEr' + dna[0] + '/*/i2MOEr' + dna[1] + '/*/i2MOEr' + dna[2] + '/*'
dnaMiddle = '*'.join(dna[3:-3])
dnaLast3Chars = '*/i2MOEr' + dna[-3] + '/*i2MOEr' + dna[-2] + '/*/32MOEr' + dna[-1] + '/'

dnaTransformed = dnaFirst3Chars + dnaMiddle + dnaLast3Chars

print(dnaTransformed)

Вывод:

/52MOErT/*/i2MOErG/*/i2MOErT/*A*C*G*T*T*G*C*T*C*C*/i2MOErG/*i2MOErA/*/32MOErC/

ОБНОВЛЕНИЕ:

Для простоты вы можете преобразовать приведенный выше код в функцию, подобную этой:

def dna_transformation(dna):
    """ Takes a DNA string and returns the transformed DNA """

    dnaFirst3Chars = '/52MOEr' + dna[0] + '/*/i2MOEr' + dna[1] + '/*/i2MOEr' + dna[2] + '/*'
    dnaMiddle = '*'.join(dna[3:-3])
    dnaLast3Chars = '*/i2MOEr' + dna[-3] + '/*i2MOEr' + dna[-2] + '/*/32MOEr' + dna[-1] + '/'

    return dnaFirst3Chars + dnaMiddle + dnaLast3Chars

print(dna_transformation("TGTACGTTGCTCCGAC")) # call the function

Выход: /52MOErT/*/i2MOErG/*/i2MOErT/*A*C*G*T*T*G*C*T*C*C*/i2MOErG/*i2MOErA/*/32MOErC/

0 голосов
/ 01 ноября 2019

Предполагая, что в ожидаемом результате есть опечатка, и она на самом деле должна быть /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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...