字典计数器

时间:2016-10-08 16:40:39

标签: python python-3.x dictionary count

假设我有一个序列“ADFG” 脚本应该看它是否在列表中(A,T,G,C)然后如果是,从字典中获取密钥并添加1。 因此,对于序列“ADFG”,它将1加到变量“a”和变量“g”,并将2加到变量“error”。 但是,虽然脚本没有返回错误,但是dicio [i] + = 1行并没有添加任何内容....任何想法? 我知道有更简单的方法可以做到这一点,但我想使用字典。

seq= input ("dna seq:").upper()  
a,t,g,c,error=0,0,0,0,0
dicio= {"A":a,"T":t,"G":g,"C":c}
for i in seq:
    if i in ("A","T","G","C"):
        dicio[i]+=1
        a+=1
    else:
        error+=1

print("A={:.2f} %".format(a/len(seq)*100))
print("T={:.2f} %".format(t/len(seq)*100))
print("G={:.2f} %".format(g/len(seq)*100))
print("C={:.2f} %".format(c/len(seq)*100))
print("Da sequencia,{:.2f} % sao erros".format(error/len(seq)*100))

2 个答案:

答案 0 :(得分:0)

你的意思是t,g,c不受dicio

中添加的影响

这是正常的:字典没有采用变量的引用,只是复制了初始值。在向字典的值添加1时,您不会更新它们。 (a是代码中的一个特例,它会在所有情况下都得到更新,但可能是一个错误,至少与其他代码相比并不合乎逻辑。)

要做你想做的事,你需要忘记你的t,g ...变量,只需使用dicio来显示结果:

for i in ("A","T","G","C"):
   print("{}={:.2f} %".format(i,dicio[i]/len(seq)*100))

(作为奖励,你将节省大量的复制/粘贴:))

BTW:如果你想初始化字典并保持按键排序,你需要ordereddict

from Collections import ordereddict

dicio = ordereddict()
for k in ("A","T","G","C"):
   dicio[k] = 0

答案 1 :(得分:0)

我认为您正在尝试使用词典来存储值,而不是将a,t,g,c连接到它并同时更新。这里有一些代码使用了一些字典功能,使其更加简洁:

seq= input ("dna seq:").upper()  
a,t,g,c,error=0,0,0,0,0
dicio= {"A":a,"T":t,"G":g,"C":c}
for i in seq:
    if i in dicio.keys():
        dicio[i]+=1
    else:
        error+=1

for key,value in dicio.items():
    print("{}={:.2f} %".format(key,value/len(seq)*100))

print("Da sequencia,{:.2f} % sao erros".format(error/len(seq)*100))