Python 在大列表中查找 kmers

Python find kmers in large lists

我如何修改下面的代码,使其不是将单个字符串作为输入,而是将字符串列表作为输入?我试图找到许多 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

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

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))