Функция замены для замены символов в любой комбинации

#python

#питон

Вопрос:

Я работаю с генетическими данными. Я пытаюсь создать функцию,которая заменяет 1-й, 2-й и 3-й символы строки в любой комбинации. Кроме того, я надеялся избежать замены персонажа, который уже находится в этой позиции.

Итак, у меня есть код, который возьмет строку нуклеотидов и разделит их на группы по три нуклеотида.

 import more_itertools as mit with open('test_data_cdna.fa.txt', "rt") as f:  for line in f:  li=line.strip()  a = ["".join(codon) for codon in mit.windowed(li, 3)]  for x in a:  print(x)  

Для каждой группы из 3 нуклеотидов я пытаюсь по существу смоделировать все комбинации мутаций в этих 3 нуклеотидах. Так, например, если первые 3 нуклеотида ATG , я надеялся получить результат, аналогичный этому (исключая морковь, морковь просто есть, чтобы было легче увидеть, визуализировать, что происходит)

Замена первого символа (морковь указывает, какой символ был заменен):

 TTG ^ GTG ^ CTG ^ ATG lt;- skip or delete because same character was replaced as original  ^  

Замена второго символа:

 AAG  ^ AGG  ^ ACG  ^ ATG lt;- skip or delete because same character was replaced as original   ^  

Замена третьего символа:

 ATA  ^ ATT  ^ ATC  ^ ATG lt;- skip or delete because same character was replaced as original   ^  

список символов, которые будут использоваться для замены

 ['A','T','G','C']  

Starting string:

 ATG  

Я надеялся просто выводить каждую замену в новый файл. При этом каждая строка файла представляет собой строку из 3 букв

Ожидаемый выходной файл:

 TTG GTG CTG AAG AGG ACG ATA ATT ATC  

Примеры данных:

 ATGGCCGCGGCGCCGGGAGGGTCAGCGCAGCCCGCTGGCCCCGGCCCGCGCCTGGGTTTC AGCACCGCGGACAGCGGCGTCGGCATGAGCGGGCTAAACCCCGGTCCCGCCGTACCCATG AAGGACCACGACGCCATCAAGCTCTTCGTGGGGCAGATCCCGCGGGGCTTGGACGAGCAG GACCTCAAGCCGCTGTTCGAGGAGTTCGGCCGCATCTACGAGCTGACGGTGCTGAAGGAC CGGCTCACCGGCCTCCACAAAGGCTGTGCCTTCCTCACCTACTGCGCCCGGGACTCTGCT CTCAAGGCCCAGAGTGCACTGCACGAGCAGAAGACCCTGCCAGGGATGAATCGTCCGATC CAAGTGAAGCCAGCTGCCAGTGAGGGCCGAGGAGAGGACCGAAAGCTGTTTGTGGGGATG CTGGGCAAGCAGCAGGGTGAGGAGGACGTCAGACGCCTGTTCCAGCCCTTTGGCCACATC GAGGAGTGCACGGTCCTGCGGAGTCCTGACGGCACCAGTAAAGGCTGTGCCTTTGTGAAG TTCGGGAGTCAAGGGGAAGCTCAGGCGGCCATCCGGGGTCTGCACGGCAGCCGGACCATG GCGGGCGCCTCGTCCAGCCTCGTGGTCAAGCTGGCGGACACCGACCGGGAGCGCGCGCTG CGGCGGATGCAGCAGATGGCCGGCCACCTGGGCGCCTTCCACCCCGCGCCACTGCCGCTA GGGGCCTGCGGCGCCTACACCACGGCGATCCTGCAGCACCAGGCGGCCCTGCTGGCGGCG GCACAGGGCCCAGGCCTAGGCCCGGTGGCGGCAGTGGCGGCCCAGATGCAACACGTGGCG GCCTTTAGCCTGGTAGCTGCGCCTCTGTTGCCCGCGGCAGCAGCCAACTCCCCGCCTGGC AGCGGCCCTGGCACCCTCCCAGGTCTTCCGGCGCCCATCGGGGTCAATGGATTCGGCCCT CTGACCCCCCAGACCAATGGCCAGCCGGGCTCCGACACGCTCTACAATAACGGGCTCTCC CCTTATCCAGCCCAGAGCCCCGGCGTGGCTGACCCCCTGCAGCAGGCCTACGCTGGGATG CACCACTACGCAGGCCCCGAAGGCTGTAACCTCTTCATCTATCACCTGCCTCAGGAGTTT GGTGATGCGGAACTCATACAGACATTCCTGCCCTTTGGAGCCGTTGTCTCTGCTAAAGTC TTTGTGGATCGAGCCACCAACCAGAGCAAGTGTTTTGGGTTTGTTAGTTTTGACAATCCA ACTAGTGCCCAGACTGCTATTCAGGCGATGAATGGCTTTCAAATTGGCATGAAGAGGCTC AAGGTCCAGCTAAAGCGGCCCAAGGATGCCAACCGGCCTTACTGA  

Комментарии:

1. Не могли бы вы уточнить свой предполагаемый результат, пожалуйста? Вы хотите создать один длинный файл или, возможно, один выходной файл для каждого нуклеотидного трио во входных данных? Если один файл, нужен ли вам какой-либо разделитель между результатами каждого входного трио?

2. Просто обновил вопрос. Всего один длинный файл. Нет необходимости в каком-либо разделении между каждым трио или отдельными файлами для каждого трио

Ответ №1:

Ниже приведена функция генератора, которая генерирует все те мутации, о которых вы спрашиваете:

 def mutation(nucs):  replacements = "ATGC"  for i in range(0, len(nucs)):  for r in replacements:  if (nucs[i] == r): continue  yield nucs[:i]   r   nucs[i 1:]  

Вы можете использовать его вот так:

 for n in mutation("ATG"):  print(n)  

Выход:

 TTG GTG CTG AAG AGG ACG ATA ATT ATC  

Правка: Извините, я не видел, что вы хотите записать выходные данные в файл. Хотя это тривиально. Вы можете сделать что-то вроде этого:

 def save_mutations(nucs, filename):  with open(filename, "w") as f:  for n in mutation("ATG"):  f.write(n   "n")  

Комментарии:

1. Это работает, но есть не просто три нуклеотида, есть гораздо больше. Мне нужен способ выполнить это на всех трио

2. Я не совсем понимаю. Что мешает вам вызвать эту функцию для каждого из трех нуклеотидов?

3. @AlpacaMax Приношу свои извинения, у меня была небольшая ошибка, когда я пытался запустить ваш ответ! Это отлично работает!

Ответ №2:

Вы можете использовать этот код:

 def replacing(i, j):  return "".join([chr if k!=i else chrs[j] for k, chr in enumerate(input_chr)])     if __name__ == '__main__':  chrs = 'ATGC'  input_chr = "ATG"   n = len(input_chr)  m = len(chrs)   for i in range(n):  for j in range(m):  output = replacing(i, j)  print(output)  

Для оптимизации кода используйте непосредственно строки (это то же самое поведение списка, когда элемент равен одному символу.