1

我有一本包含多个基因的字典。tuple(zip()) 给出每个位点的核苷酸。例如(A,A,A),(T,T,G)等。我正在尝试计算每个位点的核苷酸数量。这样站点 1 显示了 3 个 A,站点 2 显示了 2 个 T 和 1 G。当我运行我的代码时,它只添加到 A 而没有其他内容。

List = tuple(zip(*myDict.values()))

A = 0
T = 0
G = 0
C = 0

site = 0

for value in List:
    site +=1
    if 'A':
        A += 1
    elif 'T':
        T += 1
    elif 'G':
        G += 1
    else:
        C =+ 1

print 'Site:', site
print 'A:', A
print 'T:', T
print 'G:', G
print 'C:', C
4

4 回答 4

7

您可以(再次)最好地使用collections.Counter()

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

这将创建每个站点的基因计数列表。

示范:

>>> from collections import Counter
>>> myDict = {'abc':'AGCTAC', 'def': 'AGGTAC', 'ghi':'AGGTAG'}
>>> result = [Counter(site) for site in zip(*myDict.values())]
>>> result
[Counter({'A': 3}), Counter({'G': 3}), Counter({'G': 2, 'C': 1}), Counter({'T': 3}), Counter({'A': 3}), Counter({'C': 2, 'G': 1})]
>>> result[0]  # genes at site 0
Counter({'A': 3})
>>> result[2]  # genes at site 2
Counter({'G': 2, 'C': 1})
于 2012-09-28T15:31:13.243 回答
6

使用Counter()

>>> from collections import Counter
>>> lis=[('A', 'A', 'A'), ('T', 'T', 'G')]
>>> Counter(y for x in lis for y in x)
Counter({'A': 3, 'T': 2, 'G': 1})

或者,正如@Steven Rumbalski 建议的那样,使用itertools.chain()而不是生成器表达式:

>>> from itertools import chain
>>> Counter(chain(*lis))
Counter({'A': 3, 'T': 2, 'G': 1}) 

对于各个站点的单独柜台,请参见 Martijn Pieters 的回答

于 2012-09-28T15:29:58.007 回答
6

ITEM

for value in List:
    site +=1
    if value == 'A':
        A += 1
    elif value == 'T':
        T += 1
    elif value == 'G':
        G += 1
    else:
        C +=1

但是有更好的方法;查看其他答案。

此外,你不应该打电话给你的名单List;大写名称保留给类。list也不好,因为它隐藏了内置的list().

于 2012-09-28T15:30:19.633 回答
3
A = List.count("A")
B = List.count("C")
...

顺便说一句,列表是一个可怕的变量名

于 2012-09-28T15:29:53.660 回答