Есть ли способ написать одну неоднозначную последовательность РНК из нескольких однозначных последовательностей РНК в Python 3? - PullRequest
0 голосов
/ 24 декабря 2018

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

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

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 Ответ

0 голосов
/ 14 января 2019

Сначала вы хотите увидеть, какие нуклеотиды проявляют неоднозначность.Первый нуклеотид из всех ваших 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'
...