在python字典中找到键时更新值

在python字典中找到键时更新值,python,dictionary,sequence,biopython,Python,Dictionary,Sequence,Biopython,我的代码遍历了上面的序列,并使用iter_kmer()将序列分解为大小为3(“CGT”)的小读取。我想创建一个字典,它将包含所有这些小读数以及它们在序列中的数量。我得到的结果是下车,我不知道为什么 预期结果: kmers(tiny_reads,3) {'AAT':2,'ATG':3,'TGG':2} 我的结果是: {'CAA':2,'GTG':2,'GCA':2,'GCG':2,'ATG':2,'TGC':2,'CGT':2,'AAT':2,'GGC':2,'TGG':2} 我的结果不正确,因为

我的代码遍历了上面的序列,并使用iter_kmer()将序列分解为大小为3(“CGT”)的小读取。我想创建一个字典,它将包含所有这些小读数以及它们在序列中的数量。我得到的结果是下车,我不知道为什么

预期结果:

kmers(tiny_reads,3) {'AAT':2,'ATG':3,'TGG':2}

我的结果是: {'CAA':2,'GTG':2,'GCA':2,'GCG':2,'ATG':2,'TGC':2,'CGT':2,'AAT':2,'GGC':2,'TGG':2}


我的结果不正确,因为“ATG”重复了3次。你们能帮我解决这个让我沮丧的问题吗

不确定iter_kmers是如何工作的,但也许你正在寻找类似以下的东西

tiny_reads = [
Sequence('CGTGCAA'),
Sequence('TGCAATG'),
Sequence('ATGGCGT'),
Sequence('GGCGTGC'),
Sequence('CAATGGC'),]



dictionary = {} 

def kmers(reads, k):
for line in tiny_reads:
    for kmer in line.iter_kmers(k, overlap=3):
        dictionary[str(kmer)] = 1
        print(dictionary)
        if str(kmer) not in dictionary: 
            dictionary[str(kmer)] = 1
        else:
            dictionary[str(kmer)] += 1


 #print(dict)
 kmers(tiny_reads, 3)
 print(dictionary)
请记住,这可能不是最快的实现,但是它只是用最小的更改修复了错误。
从字典中读取值时,使用.get()方法可以设置默认值,以防找不到任何条目

您正在使用迭代的每一行重置字典中的计数器:

根据您已有的代码,我将使用defaultdict

tiny_reads = [
    Sequence('CGTGCAA'),
    Sequence('TGCAATG'),
    Sequence('ATGGCGT'),
    Sequence('GGCGTGC'),
    Sequence('CAATGGC')
]

kmer_d = dict()

def kmers(reads, k):
    for tiny_r in tiny_reads:
        for kmer in tiny_r.iter_kmers(k, overlap=3):
            d = kmer_d.get(str(kmer), 0)
            kmer_d[str(kmer)] = d + 1


if __name__ == "__main__":
     kmers(tiny_reads, 3)
     print(kmer_d)
如果我正在编写代码,我可能会将所有行连接在一起,然后使用计数器

from collections import defaultdict

def kmers(reads, k):
    dictionary = defaultdict(int)
    for line in tiny_reads:
        for kmer in line.iter_kmers(k, overlap=3):
            dictionary[str(kmer)] += 1
def kmers(reads, k):
    accumlator = []
    for line in tiny_reads:
        accumlator += line.iter_kmers(k, overlap=3):
    dictionary = Counter(accumlator)