5SOO_O 의 개발 공부 일지

[Python] [Rosalind] Consensus and Profile 본문

자료구조 및 바이오 인포매틱스

[Python] [Rosalind] Consensus and Profile

5soo_o 2022. 4. 11. 13:18

m x n 형태의 DNA 염기 서열 테이블이 주어진다.

염기 서열 행렬을 P라고 할 때,

P[m] 열에서 A, C, G, T 가 등장한 횟수를 기록한 새로운 행렬을 만든다.

각 열에서 가장 많이 등장한 염기(consensus)를 뽑아, 문자열로 만들어 보자.

 

데이터가 주어진다. 염기 서열이 왕왕 길다.

https://rosalind.info/problems/cons/

 

파일을 열어 보면

라벨 >Roslind 와 라벨에 해당하는 염기 서열로 이루어져 있다.

염기 서열이 너무 길어서 줄 바꿈으로 정리되어 있는데, 

이 염기 서열 정보에서 \n을 빼고 나머지를 붙여주는데 라벨을 기준으로 구분해야 한다.

 

라벨과 라벨에 해당하는 염기 서열 정보를 담기 위해 딕셔너리를 활용했다.

rosalind = dict()
seq_length = 0

with open("rosalind_cons.txt") as file:
    sequences = [i.strip() for i in file.readlines()]	# \n 제외하고 리스트에 한 줄씩 담기
    for seq in sequences:	# 문장 하나씩 검사
        if seq.startswith('>'):		# 꺼낸 문장이 > 으로 시작한다면
            rosalind_name = seq		# 해당 문장은 라벨로
            rosalind[rosalind_name] = ''	# 딕셔너리[키] 에 해당하는 빈 밸류 값 만들기
        	continue				# > 아니면 건너 뛰기
        rosalind[rosalind_name] += seq		# 문장을 딕셔너리[키] 에 해당하는 밸류에 담기
    seq_length = len(rosalind[rosalind_name])	# 시퀀스 길이는 딕셔너리 밸류값의 길이

(continue가 왜 티스토리로 옮기면 들여쓰기 되는지 모르겠다 ㅇ0ㅇ..)

print() 를 찍어 보니 줄 바꿈 된 문장이 잘 합쳐진 듯 하다.

 

from collections import Counter
A, C, G, T = [], [], [], []
consensus_seq = ''

for i in range(seq_length):	# 시퀀스 길이만큼 반복
    seq = ''				
    for k in rosalind.keys():	# key 하나씩 꺼내기
        seq += rosalind[k][i]	# 꺼낸 키의 i 번째 염기 seq에 담기. key의 값을 번갈아가면서 담는다	
        A.append(seq.count('A'))	# seq에서 A를 세서 A에 담기
        C.append(seq.count('C'))
        G.append(seq.count('G'))
        T.append(seq.count('T'))

        counts = Counter(seq)	# collections의 Counter 클래스 사용
        
        # Counter()는 파이썬 기본 자료 구조인 딕셔너리를 확장하고 있다.
        # Counter() 클래스는 딕셔너리를 활용한 작업을 좀 더 쉽게 할 수 있도록
        # 데이터의 개수를 내림차순으로 정렬해 반환하는 most_common() 메소드를 제공한다.
        
        consensus_seq += counts.most_common()[0][0] # 내림차순 정렬해, 가장 많은 데이터의 개수 담기

print(consensus_seq) # 가장 많은 염기 서열 합친 consensus 확인하기


# A C G T 등장 횟수 담은 리스트, 문제에서처럼 띄어쓰기로 구분해 담기
consensus_seq_table = '\n'.join(['A:\t' + '\t'.join(map(str, A)), 'C:\t' + '\t'.join(map(str, C)),
                    'G:\t' + '\t'.join(map(str, G)), 'T:\t' + '\t'.join(map(str, T))])
print(consensus_seq_table)

답이 잘 나왔다!

이 문제도 오래 헤맸던 문제였다 T0T

다른 사람들 코드도 참고해서 복습을 좀 해 둬야겠다.

흑흑 아직 갈 길이 멀구나

728x90