我有一个由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'
的字符串,但也许它可以,我只是做错了。
答案 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