Есть ли способ написать одну неоднозначную последовательность РНК из нескольких однозначных последовательностей РНК в Python 3?

У меня много последовательностей РНА одинаковой длины. Теперь я хочу создать функцию, которая выдаст мне одну строку двусмысленной РНА. Пока я не нахожу никакой полезной информации о написании неоднозначных последовательностей онлайн.

Я думал об использовании словаря, как это:

d = {"N": ["A", "C", "G", "U"],
 "R": ["A", "G"],
 "Y": ["U", "C"],
 "K": ["G", "U"],
 "M": ["A", "C"],
 "B": ["C", "G", "U"],
 "D": ["A", "G", "U"],
 "H": ["A", "C", "U"],
 "V": ["A", "C", "G"]}

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

 test = ['GUUUUUCAUUUA', 'GUUUUUCAUUUG', 'GUUUUUCAUCUU', 'GUUUUUCAUCUC', 
'GUUUUUCAUCUA', 'GUUUUUCAUCUG', 'GUUUUUCACUUA', 'GUUUUUCACUUG', 
'GUUUUUCACCUU', 'GUUUUUCACCUC', 'GUUUUUCACCUA', 'GUUUUUCACCUG', 
'GUUUUCCAUUUA', 'GUUUUCCAUUUG', 'GUUUUCCAUCUU', 'GUUUUCCAUCUC', 
'GUUUUCCAUCUA', 'GUUUUCCAUCUG', 'GUUUUCCACUUA', 'GUUUUCCACUUG', 
'GUUUUCCACCUU', 'GUUUUCCACCUC', 'GUUUUCCACCUA', 'GUUUUCCACCUG', 
'GUCUUUCAUUUA', 'GUCUUUCAUUUG', 'GUCUUUCAUCUU', 'GUCUUUCAUCUC', 
'GUCUUUCAUCUA', 'GUCUUUCAUCUG', 'GUCUUUCACUUA', 'GUCUUUCACUUG', 
'GUCUUUCACCUU', 'GUCUUUCACCUC', 'GUCUUUCACCUA', 'GUCUUUCACCUG', 
'GUCUUCCAUUUA', 'GUCUUCCAUUUG', 'GUCUUCCAUCUU', 'GUCUUCCAUCUC', 
'GUCUUCCAUCUA', 'GUCUUCCAUCUG', 'GUCUUCCACUUA', 'GUCUUCCACUUG', 
'GUCUUCCACCUU', 'GUCUUCCACCUC', 'GUCUUCCACCUA', 'GUCUUCCACCUG', 
'GUAUUUCAUUUA', 'GUAUUUCAUUUG']

1 ответ

Сначала вы хотите увидеть, какие нуклеотиды проявляют неоднозначность. Первый нуклеотид из всех ваших test последовательности является Gтак что никакой двусмысленности нет. Но третий нуклеотид из всех ваших тестовых последовательностей может быть A, C или же U,

Мы можем увидеть это программно, выполнив map(set, zip(*test)) (с использованием оператора распаковки*):

>>> list(map(set, zip(*test)))
[{'G'},
 {'U'},
 {'A', 'C', 'U'},
 {'U'},
 {'U'},
 {'C', 'U'},
 {'C'},
 {'A'},
 {'C', 'U'},
 {'C', 'U'},
 {'U'},
 {'A', 'C', 'G', 'U'}]

Итак, для третьего нуклеотида, где мы можем иметь A, C или же Uмы хотим заменить его на H, Но в вашем словаре H это ключ и ['A', 'C', 'U'] являются значениями. Таким образом, мы должны инвертировать словарь. Поскольку мы не можем использовать списки в качестве ключа, мы превращаем их в строки. И мы также сортируем их так, чтобы у нас всегда был один и тот же порядок.

>>> d = {''.join(sorted(v)): k  for (k, v) in d.items()}
>>> d
{'ACGU': 'N',
 'AG': 'R',
 'CU': 'Y',
 'GU': 'K',
 'AC': 'M',
 'CGU': 'B',
 'AGU': 'D',
 'ACU': 'H',
 'ACG': 'V'}

и теперь мы можем написать вашу функцию:

>>> def give_ambiguous_rna(sequences):
        return ''.join([list(s)[0] if len(s) == 1 else d[''.join(sorted(s))] for s in map(set, zip(*sequences))])
>>> give_ambiguous_rna(test)
'GUHUUYCAYYUN'
Другие вопросы по тегам