生成字母组合字符串,Python还是Bash更好?
我需要生成两个字符串,分别叫做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 个回答
2
我觉得用Python比较好。
你可以看看这里关于字符串排列的内容:使用组合生成器生成排列(Python)。另外一个值得关注的是Python中的itertools
模块,适用于2.6及以上版本 - 在Python中生成列表的所有排列。不过我注意到你的需求比较复杂,但在Python中添加必要的限制条件会比在Bash中简单。
简单、干净且易于使用。
现在,我对Bash不是很精通,但从表面上看,你可能需要写很多行代码,这些行代码几乎重复相同的内容,具体取决于你的组合情况。使用简单的组合会很好,但不适合链接组合。
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,指出了更高效的解决方案。