Python在大型列表中找到kmers

时间:2015-08-02 08:23:49

标签: python bioinformatics

如何修改下面的代码,不是将单个字符串作为输入,而是将字符串列表作为输入?我试图找到许多DNA序列列表中的所有kmers。

def kmer_count(dna, k):
    f = {}
    for x in range(len(dna)+1-k):
        kmer = dna[x:x+k]
        f[kmer] = f.get(kmer, 0) + 1
    return(f)

我的意见:

 ['GCCGGCAGCACCGGCAGCCAGGAGCCGATCGTCGCGCTGGCCGCGCTGAGCCAGGCGACGTCGGCCATCG',
 'GGCTCGTCGCGACGGTGTCGACCACGTATCACCATCCGTTTGCCGCGGCTGATCGGCACGCTCGA',
 'TCACGTGAGCGGCGGCCGCGCCCGGGGGGAACGCGGTGACGTCGTCGGTCGGCGAGGAGAATTTCGGCGAC',
 'GCCGCGTTGCCCGACCCGGAGCAGCGCTATGCGCGCGCCGCCGAATTCGTCGAAGTCGTCAACGCGCTGT',
 'TCGACGCGAACGATCCCGACGCGGTGCGACGCACGCCGAGCGGCGGCGTGTCGGAAGCT']

显然,出于实际原因,我不能连续地将每个字符串逐个分配给函数kmer_count(我的列表很大)。

1 个答案:

答案 0 :(得分:1)

您可以使用多个参数传递(*args)将多个参数传递给您的函数,并使用yield返回包含所有字典的生成器:

def kmer_count(k,*args):
  f = {}
  for dna in args: 
    for x in range(len(dna)+1-k):
        kmer = dna[x:x+k]
        f[kmer] = f.get(kmer, 0) + 1
    yield(f)

如果您想将结果作为列表获取,可以使用list将迭代器转换为列表:

print list(kmer_count(k,*args))

但是作为一种更加pythonic的方式,您可以使用itertools.islicecollections,Counter

from collections import Counter
from itertools import islice

def kmer_count(k,*args)
  for dna in args :
    yield Counter(''.join(islice(s,i,i+k)) for i in range(len(dna)+1-k))