Есть ли способ написать одну неоднозначную последовательность РНК из нескольких однозначных последовательностей РНК в 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'