5SOO_O 의 개발 공부 일지
[Python] [Rosalind] Consensus and Profile 본문
m x n 형태의 DNA 염기 서열 테이블이 주어진다.
염기 서열 행렬을 P라고 할 때,
P[m] 열에서 A, C, G, T 가 등장한 횟수를 기록한 새로운 행렬을 만든다.
각 열에서 가장 많이 등장한 염기(consensus)를 뽑아, 문자열로 만들어 보자.
데이터가 주어진다. 염기 서열이 왕왕 길다.

파일을 열어 보면
라벨 >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
'자료구조 및 바이오 인포매틱스' 카테고리의 다른 글
| [Python] [Rosalind] Calculating Expected Offspring (0) | 2022.04.12 |
|---|---|
| [Python] [Rosalind] Mortal Fibonacci Rabbits (0) | 2022.04.11 |
| [Python] [Rosalind] Mendel's First Law (0) | 2022.04.11 |
| [Python] [ROSALIND] Finding a Motif in DNA (0) | 2022.04.08 |
| [Python] join() 함수 "expected str instance, int found" 에러 (0) | 2022.04.08 |