[英]Generating all possible k-mers (string combinations) from a given list
我有一個由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'
,但是也許可以並且我做錯了。
您正在尋找的是itertools.product() 。 您可以對算法中k
的數量使用repeat
參數。
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']
您可以使用itertools.product
並為k
生成隨機值:
import itertools
import random
S = 'ARNDCEQGHILKMFPSTWYV'
final_results = map(''.join, itertools.product(*[S]*random.randint(1, 10)))
只需生成范圍為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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.