[英]update value when key is found in dictionary python
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次。 你能帮我们这个令我沮丧的人吗?
您正在使用要迭代的每一行重置字典中的计数器:
使用您已有的代码,我会使用defaultdict。
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)
不确定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()方法可以设置默认值,以防未找到任何条目
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.