簡體   English   中英

從給定列表中生成所有可能的k-mers(字符串組合)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM