从给定列表生成所有可能的k-mers(字符串组合)

时间:2018-02-08 04:42:42

标签: python string list combinations permutation

我有一个由20个字符组成的字符串S

S='ARNDCEQGHILKMFPSTWYV'

我需要从给定的输入k生成所有可能的k-mer组合。

k == 3时,有8000种组合(20*20*20),输出列表如下所示:

output = ['AAA', 'AAR', ..., 'AVV', ..., 'VVV'] #len(output)=8000

k == 2时,有400种组合(20*20),输出列表如下所示:

output = ['AA', 'AR', 'AN', ..., 'VV'] #len(output)=400

k == 1时,只有20种组合:

output =['A', 'R', 'N', ..., 'Y', 'V'] #len(output)=20

如果数字k已修复,我知道如何执行此操作,例如k == 3,那么我可以这样做:

for a in S:
   for b in S:
      for c in S:
         output.append(a+b+c)
#then len(output)=8000

但是随机选择数字k。 我试图使用排列,但它没有给我重复字母像'AAA'的字符串,但也许它可以,我只是做错了。

3 个答案:

答案 0 :(得分:3)

您要找的是itertools.product()。您可以使用repeat参数作为算法中k的数量。

from itertools import product
...
list(product('ARNDCEQGHILKMFPSTWYV', repeat=2)) # len = 400
list(product('ARNDCEQGHILKMFPSTWYV', repeat=3)) # len = 8000

请记住,它会将字符元组作为默认值返回,如果您想要字符串,则可以使用列表推导加入,如下所示:

[''.join(c) for c in product('ARNDCEQGHILKMFPSTWYV', repeat=3)]
# ['AAA', 'AAR', ..., 'AVV', ..., 'VVV']

答案 1 :(得分:1)

您可以使用itertools.product并生成k的随机值:

import itertools
import random
S = 'ARNDCEQGHILKMFPSTWYV'
final_results = map(''.join, itertools.product(*[S]*random.randint(1, 10)))

答案 2 :(得分:0)

只需在范围0..L^k-1中生成随机整数V,其中L是字符串长度,k是k-mer的长度。

然后构建相应的组合

V = Random(L**k)
for i in range(k):
    C[i] = A[V % L]       ///i-th letter using integer modulo
    V = V // L            ///integer division