0

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

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
4

2 回答 2

0

您可以使用enumerate来索引站点,并且Counter上的most_common方法可用于检查计数是否 < 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
于 2012-09-30T18:25:37.693 回答
0

使用 Dict Comprehension 并仅存储值 if 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})}

或转换Counterdict

>>> {'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}}
于 2012-09-30T18:34:04.190 回答