【问题标题】:Generating all possible k-mers (string combinations) from a given list从给定列表生成所有可能的 k-mers(字符串组合)
【发布时间】:2018-02-08 04:42:42
【问题描述】:

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

【问题讨论】:

    标签: python string list combinations permutation


    【解决方案1】:

    您正在寻找的是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']
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        只需在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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-11-23
          • 1970-01-01
          • 1970-01-01
          • 2018-06-29
          • 1970-01-01
          • 2012-02-28
          相关资源
          最近更新 更多