Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在循环中增加计数器作为字典值_Python_Loops - Fatal编程技术网

Python 在循环中增加计数器作为字典值

Python 在循环中增加计数器作为字典值,python,loops,Python,Loops,我有一个几百个氨基酸序列的列表,叫做aa_-seq,它看起来是这样的:['afyivhpmfselinefqneghecqcg','KVHSLPGMSDNGSPAVLPKTEFNKYKI','raqvedlmssphvenasipkgstpip','tstnnypmqeqailscieqtmvadak',…]。 每个序列有27个字母长。我必须确定每个位置(1-27)最常用的氨基酸以及频率 到目前为止,我已经: count_dict = {} counter = count_dict

我有一个几百个氨基酸序列的列表,叫做aa_-seq,它看起来是这样的:['afyivhpmfselinefqneghecqcg','KVHSLPGMSDNGSPAVLPKTEFNKYKI','raqvedlmssphvenasipkgstpip','tstnnypmqeqailscieqtmvadak',…]。 每个序列有27个字母长。我必须确定每个位置(1-27)最常用的氨基酸以及频率

到目前为止,我已经:

   count_dict = {} 
   counter = count_dict.values()
   aa_list = ['A', 'C', 'D', 'E' ,'F' ,'G' ,'H' ,'I' ,'K' ,'L' ,    #one-letter code for amino acids
       'M' ,'N' ,'P' ,'Q' ,'R' ,'S' ,'T' ,'V' ,'W' ,'Y']
   for p in range(0,26):                       #first round:looks at the first position in each sequence
        for s in range(0,len(aa_seq)):          #goes through all sequences of the list 
             for item in aa_list:                #and checks for the occurrence of each amino acid letter (=item)
                  if item in aa_seq[s][p]:
                      count_dict[item]            #if that letter occurs at the respective position, make it a key in the dictionary
                      counter += 1                #and increase its counter (the value, as definded above) by one 
    print count_dict

它说KeyError:'A',它指向行计数[item]。所以aa_列表中的项显然不能以这种方式添加为键。。?我该怎么做?它还给出了一个关于计数器的错误“'int'对象不可编辑”。如何增加计数器?

若要将项目添加到字典,必须将其初始化为一个值:

if item not in count_dict:
    count_dict[item]=0
您可以使用该函数作为一行程序执行此操作:

count_dict.setdefault(item,0)

这就是如何快速统计字典中的条目,只需将其添加到您创建的任何代码中即可

count_dict = {} 

aa_list = ['A', 'C', 'D', 'E' ,'F' ,'G' ,'H' ,'I' ,'K' ,'L' ,
       'M' ,'N' ,'P' ,'Q' ,'R' ,'S' ,'T' ,'V' ,'W' ,'Y']

for element in aa_list:
    count_dict[element]=(count_dict).get(element,0)+1

print (count_dict)
你可以去上课

然而,如果您有大数据集,我可能会非常低效。

修改代码 这是您的代码的一个经过修改的工作版本。虽然效率不高,但应该输出正确的结果

请注意:

  • 每个索引需要一个计数器。因此,您应该在第一个循环中初始化dict
  • 范围(0,26)
    只有26个元素:从0到25(包括)
  • 帮助您为每个起始值定义
    0
  • 您需要使用
    count\u dict[item]+=1递增计数器
  • 在每个循环的末尾,您需要找到具有最高值(出现次数)的键(氨基酸)

它输出:

('R', 1)
('S', 1)
('Y', 1)
('S', 1)
('E', 1)
('P', 1)
('P', 2)
('M', 4)
...
带计数器的替代方案 您不需要那么多循环,只需要在每个序列的每个字符上迭代一次

此外,无需重新发明轮子:而且是比
defaultdict
max
更好的选择

from collections import Counter

aa_seqs = ['AFYIVHPMFSELINFQNEGHECQCQCG', 'KVHSLPGMSDNGSPAVLPKTEFNKYKI', 'RAQVEDLMSLSPHVENASIPKGSTPIP', 'TSTNNYPMVQEQAILSCIEQTMVADAK']

counters = [Counter() for i in range(27)]

for aa_seq in aa_seqs:
    for (i, aa) in enumerate(aa_seq):
        counters[i][aa] += 1

most_commons = [counter.most_common()[0] for counter in counters]
print(most_commons)
它输出:

('R', 1)
('S', 1)
('Y', 1)
('S', 1)
('E', 1)
('P', 1)
('P', 2)
('M', 4)
...
[('K',1),('A',1),('Y',1),('N',1),('N',1),('Y',1),('p',2), ('M',4),('S',2),('Q',1),('E',2),('G',1),('H',1),('N',1), ('L',1),('N',1),('N',1),('I',1),('G',1),('H',1),('E',2), ('G',1),('N',1),('K',1),('Y',1),('K',1),('G',1)]


你想用
计数[项目]
做什么?即使该词典中确实存在
,也只需查找该值并立即将其丢弃;这里不分配任何内容。另外,
计数器
定义为开始时count_dict中的值列表;这是一个空列表,因为count_dict是空的。因此,<代码>计数器+= 1 没有意义,因为你不能向列表中添加整数。不像在C++语言中,你可以通过引用它们来初始化字典(map)条目,在Python中你需要显式初始化字典条目。否则我怎么计算键的出现次数并将其存储为值呢?啊,太酷了,我可以试试。但是
最常见的()[0]
做了什么,因为输出只给出了所有字母的数量。@ccarroo:列表就是所需的信息。第一个元组是序列中索引0处最常见的字符,出现次数为1。例如,您可以看到
M
在索引7中出现了4次。
most_common([n])
将n个最常见的元素打印为一个列表。因此,
most_common()[0]
在位置i处打印出一个最常见的元素。这仅仅是因为在纯python中迭代列表很慢。当人们谈论“氨基酸序列”时,我立刻想到了千兆字节的数据。因此,使用numpy数组或cython可能是一个不错的选择。是的,但是对于python新手来说,一行代码很难理解。因此,您的解决方案也有一些价值。
from collections import Counter

aa_seqs = ['AFYIVHPMFSELINFQNEGHECQCQCG', 'KVHSLPGMSDNGSPAVLPKTEFNKYKI', 'RAQVEDLMSLSPHVENASIPKGSTPIP', 'TSTNNYPMVQEQAILSCIEQTMVADAK']

counters = [Counter() for i in range(27)]

for aa_seq in aa_seqs:
    for (i, aa) in enumerate(aa_seq):
        counters[i][aa] += 1

most_commons = [counter.most_common()[0] for counter in counters]
print(most_commons)