[英]Iterating through tuples to count values in list
我有一本有多个基因的字典。 元组(zip())给出每个位点的核苷酸。 例如(A,A,A),(T,T,G),等等。我正在尝试计算每个位点的核苷酸数量。 这样,站点1显示3个A,站点2显示2个T和1G。当我运行我的代码时,它只是添加到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
您可以(再次),最好使用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})
使用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的回答
企业
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()
。
A = List.count("A")
B = List.count("C")
...
btw列表是一个可怕的变量名
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.