生成字母组合字符串,Python还是Bash更好?

1 投票
6 回答
1185 浏览
提问于 2025-04-15 19:58

我需要生成两个字符串,分别叫做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

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

将字符串STA转换成等价的字符串STB,最有效的方法是使用字符串的 translatemaketrans 函数。

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

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

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,指出了更高效的解决方案。

撰写回答