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