2012-09-28 6 views
1

나는 여러 개의 유전자를 가진 사전을 가지고있다. 튜플 (zip())은 각 사이트에서 뉴클레오티드를 제공합니다. 예 : (A, A, A), (T, T, G) 등등. 각 사이트에서 뉴클레오타이드의 수를 세지려고합니다. 사이트 1에는 3 개의 A가 표시되고 사이트 2에는 2 개의 T와 1 개의 G가 표시됩니다. 코드를 실행하면 A 만 추가됩니다. 대신에 발전기 표현의 itertools.chain()를 사용하여, @Steven Rumbalski이 제안 또는튜플을 반복하여리스트의 값을 카운트

>>> 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}) 

:

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 
+0

관련 :리스트로 사전 위치 값을 분석 (http://stackoverflow.com/q/12633774) 사전 사용 파이썬 유전자 돌연변이를 계산 (HTTP//stackoverflow.com/q/12631052) 및 [정규식을 사용하여 파이썬에서 사전으로 데이터 변환하기] (0120-336-301) –

답변

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}) 
3
A = List.count("A") 
B = List.count("C") 
... 

은 BTW 목록 끔찍한 변수 이름

+2

각 문자의 전체 목록을 반복합니다. 'collections.Counter'를 사용하는 것이 더 좋습니다. –

+0

나는 카운터의 대답에 동의하고 +1했다. 그러나 이것은 무엇이 계속되고 있는지 명확하고 (그 카운터가 반드시 isnt하지는 않음) –

6

사용 Counter()입니다

>>> from itertools import chain 
>>> Counter(chain(*lis)) 
Counter({'A': 3, 'T': 2, 'G': 1}) 
개별 사이트에서

및 별도의 카운터를 볼 마티 피에 터스의 answer

+0

또는'Counter (itertools.chain (* lis))'이다. –

+0

@StevenRumbalski는 발전기 표현보다 이점이 있습니까? –

+0

성능면에서 이점이 있는지 의심 스럽습니다. 중첩 된 생성기 표현식을 볼 때마다 나는 그것을 느리게 읽을 필요가있다. 'chain'은 실제로 일어나고있는 것에 대해 좋은 이름을 붙입니다. 물론 가독성은 주관적입니다. –

6

ITYM

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()입니다.

+1

@glglgl .. ITYM'C + = 1' :) –

+0

오른쪽. 나는 방금 C & P를 했어. – glglgl

+0

@glglgl .. 그래, 나는 알고 있었다. .. –