什么是最好的,python或bash用于从字母组合生成字符串?

时间:2010-03-03 19:12:29

标签: python bash

我需要生成字符串STA和STB。

STA和STB是长度为10的字符串,每个字符串只能包含字符A,T,G或C.

我必须生成所有可能的STA组合,并且根据STA,我生成STB。

方式是角色A总是与T相关联,反之亦然,G与C相关,反之亦然。

所以可能的组合如下:

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

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

等等。

我想知道使用bash或python

执行此操作的最佳方法是什么

由于

6 个答案:

答案 0 :(得分:2)

我会说Python。

请查看字符串排列:Permutations using a Combinations Generator (Python)。另一件需要注意的是Python 2.6 + - Generating all permutations of a list in python中的itertools。但我确实注意到你的要求更深入,但是你可能会发现在Python中添加必要的约束而不是Bash更容易。

简单,干净,简单。

现在,我不是Bash的专家,但看着它,你必须有多条线,一遍又一遍地重复几乎相同的文字,这取决于你的组合。使用简单的组合会很棒,但不能使用链接组合。

答案 1 :(得分:2)

虽然我不知道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)

感谢Dave,强调更有效的解决方案。

答案 2 :(得分:2)

其他人已经说过如何生成STA。

将字符串STA转换为等效字符串STB的最有效方法是使用字符串translate& maketrans函数。

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

在我的系统上,这比根据SilentGhost建议对每个字符进行字典查找快约100倍。

答案 3 :(得分:1)

你走了:

>>> 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中可用。

有关Python 2.5中product的实现,请参阅@ hop的回答here

答案 4 :(得分:1)

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

答案 5 :(得分:0)

与您的实际问题无关,但与您(显然)正在做的事情有关,您是否已查看BioPython