2016-10-11 4 views
4

제가리스트 목록 가지고파이썬에서 for 루프를 통해 목록을 전달하는 방법은 무엇입니까?

sample = [['TTTT', 'CCCZ'], ['ATTA', 'CZZC']] 
count = [[4,3],[4,2]] 
correctionfactor = [[1.33, 1.5],[1.33,2]] 

내가 각 자 (PI)의 주파수를 계산을하여 제곱 한 후 합계를 (- 합 그때 헤트 = 1을 계산).

The desired output [[1,2],[1,2]] #NOTE: This is NOT the real values of expected output. I just need the real values to be in this format. 

문제점 :이 목록에서 목록 (샘플, 개수)을 전달하여 필요한 값을 추출하는 방법을 모르겠습니다. 이전에이 코드를 사용하여 목록 (예 : ['TACT','TTTT'..]) 만 전달했습니다.

  • 나는 샘플의 각 요소에 대한 인덱스 (즉, 인덱스가 sample[0] = ['TTTT', 'CCCZ']sample[1] = ['ATTA', 'CZZC'] 이상. 내가 코드에 그것을 통합하는 방법을 잘 오전, 루프에 대한 더 큰를 추가 할 필요가 있다고 생각한다.

** 코드

list_of_hets = [] 
for idx, element in enumerate(sample): 
    count_dict = {} 
    square_dict = {} 
    for base in list(element): 
     if base in count_dict: 
      count_dict[base] += 1 
     else: 
      count_dict[base] = 1 
    for allele in count_dict: #Calculate frequency of every character 
     square_freq = (count_dict[allele]/count[idx])**2 #Square the frequencies 
     square_dict[allele] = square_freq   
    pf = 0.0 
    for i in square_dict: 
     pf += square_dict[i] # pf --> pi^2 + pj^2...pn^2 #Sum the frequencies 
    het = 1-pf      
    list_of_hets.append(het) 
print list_of_hets 

"Failed" OUTPUT: 
line 70, in <module> 
square_freq = (count_dict[allele]/count[idx])**2 
TypeError: unsupported operand type(s) for /: 'int' and 'list'er 
+1

변경 ** 정확히 ** 무엇을 잘못 :'square_freq = (count_dict [대립 유전자]/카운트 [IDX]) ** 2 '는'TypeError :/int '와'list '에 대해 지원되지 않는 피연산자 유형을 발생시킵니다. 'int'를'list'로 나눌 수 없습니다. 그건 그렇고, 이것은 여러분이 작성한 코드와 일치하지 않습니다. 왜냐하면'counts [idx]'를'float'에 넘겨 줄 때 또 다른'TypeError'를 발생시킬 것입니다. –

+0

subquq, zip의 subr (count_dict [allele], counts)]'와 같이'square_freq = [[n/d는 n, d는 zip (subq, subr)]와 같은 zip 명령을 사용하려고합니다. 하지만 여전히 오류가 있습니다. 다른 제안? – biogeek

+0

@ PM2Ring 수정했습니다. 그것을 지적 해 주셔서 감사합니다 – biogeek

답변

3

나는 당신이 당신의 데이터에서 'Z'항목을 처리하는 방법에 완전히 명확하지 않다,하지만이 코드는에서 샘플 데이터의 출력을 복제 이 코드는 count_dict 대신 collections.Counter을 사용하여 더욱 간단하게 될 수

{'A': 2, 'T': 2} 
{'A': 1, 'T': 2, 'G': 1} 
{'A': 1, 'C': 1, 'T': 2} 
{'A': 1, 'T': 3} 
[[0.5, 0.625], [0.625, 0.375]] 

1,646,938,863,210

from __future__ import division 

bases = set('ACGT') 
#sample = [['TTTT', 'CCCZ'], ['ATTA', 'CZZC']] 
sample = [['ATTA', 'TTGA'], ['TTCA', 'TTTA']] 

list_of_hets = [] 
for element in sample: 
    hets = [] 
    for seq in element: 
     count_dict = {} 
     for base in seq: 
      if base in count_dict: 
       count_dict[base] += 1 
      else: 
       count_dict[base] = 1 
     print count_dict 

     #Calculate frequency of every character 
     count = sum(1 for u in seq if u in bases) 
     pf = sum((base/count) ** 2 for base in count_dict.values()) 
     hets.append(1 - pf) 
    list_of_hets.append(hets) 

print list_of_hets 

출력.

'ACGT'에없는 기호가 인 경우 항상 'Z'이면 count의 계산 속도를 높일 수 있습니다. bases = set('ACGT') 제거 및 오류 메시지를 알려줍니다

count = sum(1 for u in seq if u in bases) 

count = sum(1 for u in seq if u != 'Z') 
+0

최종 출력물은'[[0.5, 0.625], [0.625, 0.375]]'set1 ([ 'ATTA', 'TTGA']) 대 set2 [ 'TTCA', 'TTTA']의 첫 번째 요소를 구별 할 수 있어야하기 때문에 – biogeek

+0

또한 "Zs "나는 그것을 처리하는 방법을 알아 냈습니다. – biogeek

+0

@biogeek : 그렇게하기 쉽습니다. 내 답변의 새 버전을 참조하십시오. –