如何修改下面的代码,不是将单个字符串作为输入,而是将字符串列表作为输入?我试图找到许多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
(我的列表很大)。
答案 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.islice
和collections,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))