2016-09-15 4 views
0

메신저는 텍스트 파일의 시퀀스에서 dinuc 수와 주파수를 찾으려고 시도하지만 내 코드는 단일 뉴클레오티드 카운트 만 출력합니다.dinucleotide 카운트 및 주파수

e = "ecoli.txt" 

ecnt = {} 

with open(e) as seq: 
    for line in seq: 
     for word in line.split(): 
      for i in range(len(seqr)): 
       dinuc = (seqr[i] + seqr[i:i+2]) 
       for dinuc in seqr: 
        if dinuc in ecnt: 
         ecnt[dinuc] += 1 
        else: 
         ecnt[dinuc] = 1 

for x,y in ecnt.items(): 
    print(x, y) 

샘플 입력 "AAATTTCGTCGTTGCCC"

샘플 출력 : AA : 2 TT : 3 TC : 2 CG : 2 GT : 2 GC : 1 CC : 2

지금 내 출력을위한 단일 뉴클레오타이드를 얻는 Im :

C 83550600 A 60342100 T 88192300 G 즉 "AAA"반복 뉴클레오티드를 들어 92834000

는 카운트 연속 'AA'의 가능한 모든 조합을 반환해야하므로 출력은 그것은 주문 어떤 문제가 나던 2가 아닌 1이어야한다 dinucleotides가 나열되면, 나는 모든 조합을 필요로하고 반복 된 뉴클레오타이드에 대한 정확한 카운트를 리턴하는 코드가 필요하다. 내 조교에게 물어보고 내 유일한 문제는 내 사전에 dinucleotides를 추가하는 'for'루프를 얻는 것이었고 내 범위가 잘못되거나 틀릴 수도 있다고 생각했습니다. 파일은 정말 큰 파일이므로 시퀀스가 ​​여러 줄로 나뉩니다.

미리 감사드립니다.

+1

샘플 입력의 짧은 부분과 해당 원하는 출력을 표시합니다. – John1024

+0

무엇이'seqr'입니까? 게시 한 스 니펫에 정의되지 않았습니다. –

+0

코드가 여러 가지 방법으로 손상되었습니다. 'seqr'이란 무엇입니까? 왜 line.split()에서 단어를 공백으로 분리 했습니까?', DNA 시퀀스가 ​​아니겠습니까? 개행 기호를 제거하지 마십시오. –

답변

0

나는 당신의 코드를보고 당신이보고 싶을지도 모르는 몇 가지 것을 발견했다. 이 파일이 500 개 뉴클레오티드의 단일 순서가

import random 
def write_random_sequence(): 
    out_file = open("ecoli.txt", "w") 
    num_nts = 500 
    nts_per_line = 80 
    nts = [] 
    for i in range(num_nts): 
     nt = random.choice(["A", "T", "C", "G"]) 
     nts.append(nt) 
    lines = [nts[i:i+nts_per_line] for i in range(0, len(nts), nts_per_line)] 
    for line in lines: 
     out_file.write("".join(line) + "\n") 
    out_file.close() 
write_random_sequence() 

공지 것을 : 나는 ecoli.txt을 가지고 있지 않았기 때문에, 나는 다음과 같은 기능을 가진 임의 뉴클레오티드로 내 자신의 하나를 생성, 내 솔루션을 테스트하기 위해

각각 80 개의 뉴클레오타이드 라인으로 분리된다. 한 줄 끝에 첫 번째 뉴클레오타이드가 있고 두 번째 뉴클레오타이드가 다음 줄의 시작 부분에있는 디 뉴클레오티드를 계산하려면이 별도의 줄을 모두 공백없이 단일 문자열로 병합해야합니다. 우선 그걸 해봅시다 :

"seq"를 인쇄하여 모든 뉴클레오티드를 포함하는 거대한 문자열이어야합니다. 다음으로, 우리는 시퀀스 문자열에서 디 뉴클레오티드를 찾아야합니다. 우리는 당신이 시도한 슬라이싱을 사용하여 이것을 할 수 있습니다. 따라서 문자열의 각 위치에 대해 현재의 뉴클레오티드와 그 이후의 뉴클레오티드를 봅니다.

for i in range(len(seq)-1):#note the -1 
    dinuc = seq[i:i+2] 

우리는 다음 사전 "ECNT"의 뉴클레오티드 및 이들의 스토리지의 계산을 할 수있는 대단히가 있었다처럼. 마지막 코드는 다음과 같습니다

ecnt = {} 
seq = "" 
with open("ecoli.txt", "r") as seq_data: 
    for line in seq_data: 
     seq += line.strip() 
for i in range(len(seq)-1): 
    dinuc = seq[i:i+2] 
    if dinuc in ecnt: 
     ecnt[dinuc] += 1 
    else: 
     ecnt[dinuc] = 1 
print ecnt 
0

defaultdict 사용할 수있는 완벽한 기회 :

from collections import defaultdict 

file_name = "ecoli.txt" 

dinucleotide_counts = defaultdict(int) 

sequence = "" 

with open(file_name) as file: 
    for line in file: 
     sequence += line.strip() 

for i in range(len(sequence) - 1): 
    dinucleotide_counts[sequence[i:i + 2]] += 1 

for key, value in sorted(dinucleotide_counts.items()): 
    print(key, value)