我正在使用以下代码解压缩字典并计算每个站点的值:
result = [Counter(site) for site in zip(*myDict.values())]
输出类似于:Counter({'A': 74}), Counter({'G': 72, 'C': 2})
有五种可能的值:A, T, G, C
和N
如果五个值中的一个小于74,我只希望计数器吐出一个值。因此对于上面的例子,只输出第二个值。你如何在柜台内使用if语句?此外,我如何标记每个网站,以便上面可以说:
Site 2: 'G': 72, 'C': 2
myDict看起来像这样:
{'abc123': ATGGAGGACGACT, 'def332': ATGCATTGACGC}
除了有74个条目。每个值都是相同的长度。基本上,我不知道如何使用一个计数器,它可以为每个值的每个站点不匹配时的输出。因此对于上面的序列,第4个站点不匹配。我希望计数器输出以下内容:
site 4: 'G': 1, 'C': 1
答案 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}}