Python 将字符串中的多个位置分别切换为多个字母

Python switching multiple positions in string each to multiple letters

我正在尝试编写一个 python 代码来查找 DNA 序列中的限制酶位点。限制性内切酶切割特定的 DNA 序列,但有些酶并不那么严格,例如 XmnI 切割此序列:

GAANNNNTTC

其中 N 可以是任何核苷酸(A、C、G 或 T)。如果我的数学是正确的,那就是它可以切割 4^4 = 256 个独特的序列。我想列出这 256 个短序列,然后根据(更长的)输入 DNA 序列检查每个序列。但是,我很难生成 256 个序列。这是我目前所拥有的:

cutsequencequery = "GAANNNNTTC"
Nseq = ["A", "C", "G", "T"]
querylist = []
if "N" in cutsequencequery:
    Nlist = [cutsequencequery.replace("N", t) for t in Nseq]
    for j in list(Nlist):
        querylist.append(j)

for i in querylist:
    print(i)
print(len(querylist))

这是输出:

GAAAAAATTC
GAACCCCTTC
GAAGGGGTTC
GAATTTTTTC
4

所以它将每个 N 切换为 A、C、G 和 T,但我认为我需要另一个循环(或 3 个?)来生成所有 256 种组合。有没有我没有看到的有效方法?

也许你应该看一下 python's itertools library,其中包括 product,它使用每个可迭代对象的组合创建一个可迭代对象,因此:

from itertools import product

cutsequencequery = "GAANNNNTTC"
nseq = ["A", "C", "G", "T"]

size = cutsequencequery.count('N')

possibilities = product(*[nseq for i in range(size)]) 
# = ('A', 'A', 'A', 'A'), ... , ('T', 'T', 'T', 'T') 
# len(list(possibilities)) = 256 = 4^4, as expected

s = set()
for n in possibilities:
    print(''.join(n)) # = 'AAAA', ..., 'TTTT'
    new_sequence = cutsequencequery.replace('N' * size, ''.join(n))
    
    s.add(new_sequence)
    print(new_sequence) # = 'GAAAAAATTC', ..., 'GAATTTTTTC'
print(len(s)) # 256 unique sequences