Мне нужно сгенерировать строки STA и STB.
STA и STB - строки длиной 10, каждая из которых может содержать только символы A, T, G или C.
Мне нужно сгенерировать все возможные комбинации STA, и в зависимости от STA я генерирую STB.
Суть в том, что символ А всегда ассоциируется с Т и наоборот, а G с С и наоборот.
так что возможны комбинации типа:
STA: ATGC... STB: TACG...
или
STA: GTTA... STB: CAAT...
и т. Д.
Интересно, что будет лучшим способом сделать это, используя bash или python
Спасибо
Другие говорили, как генерировать STA.
Наиболее эффективный способ преобразования строки STA в эквивалентную строку STB - это использование строки translate & maketrans functions.
>>> import string >>> s = "AGTC" * 100 >>> trans = string.maketrans("ATGC", "TACG") >>> s.translate(trans) 'TCAG...TCAG'
В моей системе это примерно в 100 раз быстрее, чем поиск по словарю для каждого символа в соответствии с предложением SilentGhost.
Хотя я не знаю bash и не понимаю, как permutations решит вашу проблему, похоже, itertools.product - довольно простой способ сделать это:
permutations
itertools.product
>>> s = 'atgc' >>> d = dict(zip(s, 'tacg')) >>> import itertools >>> for i in itertools.product(s, repeat=10): sta = ''.join(i) stb = ''.join(d[x] for x in i)
, в то время как предложенный метод действителен с точки зрения получения всех возможных перестановок с заменой строки 'atgc', т. Е. Поиск строки sta, поиск stb будет более эффективным не через поиск в словаре, а скорее Механизм перевода:
'atgc'
sta
stb
>>> trans = str.maketrans(s, 'tacg') >>> for i in itertools.product(s, repeat=10): sta = ''.join(i) stb = sta.translate(trans)
Спасибо Дейву за то, что он выдвинул на первый план более эффективное решение.
Я бы сказал Python.
Просмотрите здесь перестановки строк: Перестановки с использованием генератора комбинаций (Python) . Еще одна вещь, на которую стоит обратить внимание: itertools в Python 2.6 + - Генерация всех перестановок списка в Python . Однако я отмечаю, что ваши требования более глубоки, однако вам, вероятно, будет проще добавить необходимые ограничения в Python, а не в Bash.
itertools
Просто, чисто и легко.
Теперь я не специалист по Bash, но, глядя на это, вам понадобится несколько строк, которые повторяют один и тот же текст снова и снова в зависимости от ваших комбинаций. Было бы здорово использовать простые комбинации, но не связанные комбинации.
bash baby:)
STA=$(echo {A,C,T,G}{A,C,T,G}{A,C,T,G}{A,C,T,G}{A,C,T,G}{A,C,T,G}{A,C,T,G}{A,C,T,G}{A,C,T,G}{A,C,T,G}) STB=$(echo $STA | tr ATCG TAGC) echo $STA echo $STB
Вот, пожалуйста:
>>> from itertools import product >>> seq = ("AGCT",) * 10 >>> STA = [''.join(a) for a in product(*seq)] >>> STB = list(reversed(STA))
Кстати, len(STA) - это 2 20 .
len(STA)
itertools.product доступно в Python 2.6.
См. Ответ @ hop здесь для реализации product в Python 2.5
product
Не имеет отношения к вашему актуальному вопросу, но связано с тем, что вы (очевидно) делаете, проверили ли вы BioPython ?