【问题标题】:update value when key is found in dictionary python在字典python中找到键时更新值
【发布时间】:2016-04-28 03:30:17
【问题描述】:
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)

我的代码遍历上面的序列并使用 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 次。你们能帮帮我吗?这让我很沮丧。

【问题讨论】:

    标签: python dictionary sequence biopython


    【解决方案1】:

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

    使用您已有的代码,我会使用默认字典。

    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
    

    如果我正在编写代码,我可能会将所有行连接在一起,然后使用 Counter。

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

    【讨论】:

      【解决方案2】:

      不确定 iter_kmers 的具体工作原理,但也许您正在寻找类似以下的内容?

      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)
      

      请记住,这可能不是最快的实现,但它只是通过最小的更改来修复错误。 从字典中读取值时,使用 .get() 方法可以设置默认值,以防找不到条目

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-25
        • 2016-02-20
        • 2020-04-27
        • 2018-11-11
        • 2021-07-28
        • 2020-07-22
        • 2013-05-20
        • 2017-07-18
        相关资源
        最近更新 更多