Что лучше, Python или Bash для генерации строк из комбинаций букв? - PullRequest
1 голос
/ 03 марта 2010

Мне нужно сгенерировать строки STA и STB.

STA и STB - строки длиной 10, каждая из которых может содержать только символы A, T, G или C.

Мне нужно сгенерировать все возможные комбинации STA, и в зависимости от STA я генерирую STB.

Суть в том, что символ А всегда ассоциируется с Т и наоборот, а G с С и наоборот.

так что возможны комбинации типа:

STA: ATGC...
STB: TACG...

или

STA: GTTA...
STB: CAAT...

и т. Д.

Интересно, что будет лучшим способом сделать это, используя bash или python

Спасибо

Ответы [ 6 ]

2 голосов
/ 03 марта 2010

Другие говорили, как генерировать STA.

Наиболее эффективный способ преобразования строки STA в эквивалентную строку STB - это использование строки translate & maketrans functions.

>>> import string
>>> s = "AGTC" * 100
>>> trans = string.maketrans("ATGC", "TACG")
>>> s.translate(trans)
'TCAG...TCAG'

В моей системе это примерно в 100 раз быстрее, чем поиск по словарю для каждого символа в соответствии с предложением SilentGhost.

2 голосов
/ 03 марта 2010

Хотя я не знаю bash и не понимаю, как 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 будет более эффективным не через поиск в словаре, а скорее Механизм перевода:

>>> trans = str.maketrans(s, 'tacg')
>>> for i in itertools.product(s, repeat=10):
    sta = ''.join(i)
    stb = sta.translate(trans)

Спасибо Дейву за то, что он выдвинул на первый план более эффективное решение.

2 голосов
/ 03 марта 2010

Я бы сказал Python.

Просмотрите здесь перестановки строк: Перестановки с использованием генератора комбинаций (Python) . Еще одна вещь, на которую стоит обратить внимание: itertools в Python 2.6 + - Генерация всех перестановок списка в Python . Однако я отмечаю, что ваши требования более глубоки, однако вам, вероятно, будет проще добавить необходимые ограничения в Python, а не в Bash.

Просто, чисто и легко.

Теперь я не специалист по Bash, но, глядя на это, вам понадобится несколько строк, которые повторяют один и тот же текст снова и снова в зависимости от ваших комбинаций. Было бы здорово использовать простые комбинации, но не связанные комбинации.

1 голос
/ 04 марта 2010

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
1 голос
/ 03 марта 2010

Вот, пожалуйста:

>>> from itertools import product
>>> seq = ("AGCT",) * 10
>>> STA = [''.join(a) for a in product(*seq)]
>>> STB = list(reversed(STA))

Кстати, len(STA) - это 2 20 .

itertools.product доступно в Python 2.6.

См. Ответ @ hop здесь для реализации product в Python 2.5

0 голосов
/ 03 марта 2010

Не имеет отношения к вашему актуальному вопросу, но связано с тем, что вы (очевидно) делаете, проверили ли вы BioPython ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...