我需要生成字符串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
执行此操作的最佳方法是什么由于
答案 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?