簡體   English   中英

通過元組迭代以計算列表中的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM