查找仅在Python中特定位置可变的字符串的所有排列



我有一个DNA序列,它只在特定位置可变,需要找到所有可能的场景:

DNA_seq='ANGK' #N can be T or C  and K can be A or G
N=['T','C']
K=['A','G']

结果:

['ATGA','ATGG','ACGA','ACGG']

@vladimir提供的解决方案非常适用于像上面的例子这样的简单情况,但对于下面的复杂场景,它会很快耗尽内存。对于下面的示例,即使使用120G内存运行也会以内存不足错误结束。这是令人惊讶的,因为组合的总数将是大约500K的33bp字符串,我认为这不应该消耗超过100G的RAM。我的假设错了吗?有什么建议吗?

N=['A','T','C','G']
K=['G','T']
dev_seq=[f'{N1}{N2}{K1}{N3}{N4}{K2}{N5}{N6}{K3}TCC{N7}{N8}{K4}CTG{N9}{N10}{K5}CTG{N11}{N12}{K6}{N13}{N14}{K7}{N15}{N16}{K8}' for 
N1,N2,K1,N3,N4,K2,N5,N6,K3,N7,N8,K4,N9,N10,K5,N11,N12,K6,N13,N14,K7,N15,N16,K8 in 
product(N,N,K,N,N,K,N,N,K,N,N,K,N,N,K,N,N,K,N,N,K,N,N,K)]

使用itertools.product:

from itertools import product
result = [f'A{n}G{k}' for n, k in product(N, K)]

结果:

['ATGA', 'ATGG', 'ACGA', 'ACGG']

编辑

如果你不想一次将整个列表存储在内存中,而是希望在字符串出现时按顺序处理,你可以使用生成器:

g = (f'A{n}G{k}' for n, k in product(N, K))

最新更新