在python中更改计数器的输出

时间:2012-09-30 18:04:28

标签: python counter

我正在使用以下代码解压缩字典并计算每个站点的值:

result = [Counter(site) for site in zip(*myDict.values())]

输出类似于:Counter({'A': 74}), Counter({'G': 72, 'C': 2}) 有五种可能的值:A, T, G, CN

如果五个值中的一个小于74,我只希望计数器吐出一个值。因此对于上面的例子,只输出第二个值。你如何在柜台内使用if语句?此外,我如何标记每个网站,以便上面可以说:

Site 2: 'G': 72, 'C': 2

myDict看起来像这样:

{'abc123': ATGGAGGACGACT, 'def332': ATGCATTGACGC}

除了有74个条目。每个值都是相同的长度。基本上,我不知道如何使用一个计数器,它可以为每个值的每个站点不匹配时的输出。因此对于上面的序列,第4个站点不匹配。我希望计数器输出以下内容:

site 4: 'G': 1, 'C': 1

2 个答案:

答案 0 :(得分:0)

您可以使用enumerate为网站编制索引,most_common上的Counter方法可用于检查计数是否为< 74.这是一个只有两个字符串的例子:

from collections import Counter
myDict = {'a':'ATGTTCN','b':'ATTTCCG'}
result = [(i,Counter(site)) for i,site in enumerate(zip(*myDict.values()))]
result = [x for x in result if x[1].most_common()[0][1] < 2]
for site,count in result:
    print 'Site {}: {}'.format(site,str(count)[9:-2])

输出:

Site 2: 'T': 1, 'G': 1
Site 4: 'C': 1, 'T': 1
Site 6: 'G': 1, 'N': 1

答案 1 :(得分:0)

使用Dict理解并仅存储max(Counter(x).values())<74时的值, 使用enumerate()获取Site号码。

>>> mydict={'abc123': 'ATGGAGGACGACT', 'def332': 'ATGCATTGACGC'}
>>> result={'Site {}'.format(i+1):Counter(x) for i,x in enumerate(zip(*mydict.values())) if max(Counter(x).values())<2}
>>> result
{'Site 7': Counter({'T': 1, 'G': 1}), 'Site 6': Counter({'T': 1, 'G': 1}), 'Site 4': Counter({'C': 1, 'G': 1}), 'Site 9': Counter({'A': 1, 'C': 1}), 'Site 8': Counter({'A': 1, 'G': 1}), 'Site 11': Counter({'A': 1, 'G': 1}), 'Site 10': Counter({'C': 1, 'G': 1})}

或将Counter转换为dict

>>> {'Site {}'.format(i+1):dict(Counter(x)) for i,x in enumerate(zip(*mydict.values())) if max(Counter(x).values())<2}

{'Site 7': {'T': 1, 'G': 1}, 'Site 6': {'T': 1, 'G': 1}, 'Site 4': {'C': 1, 'G': 1}, 'Site 9': {'A': 1, 'C': 1}, 'Site 8': {'A': 1, 'G': 1}, 'Site 11': {'A': 1, 'G': 1}, 'Site 10': {'C': 1, 'G': 1}}