5SOO_O 의 개발 공부 일지

[Python] [ROSALIND] Computing GC Content 본문

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

[Python] [ROSALIND] Computing GC Content

5soo_o 2022. 4. 7. 14:34

https://rosalind.info/problems/gc/

 

데이터를 읽고, 

각 염기 서열에서 G와 C가 몇 개 있는지 찾아

가장 많이 가지고 있는 유전자를 찾는 문제이다.

 

 

1. 파일을 읽어 오는 코드

with open("./rosalind_gc.txt") as f:
    sequence = f.readlines()

readlines()로 파일을 읽어보면

한 줄씩 \n이 들어있다. 

\n을 빼기 위해 strip()을 활용해서 다시 작성했다.

 

def readfile(filepath):
    with open(filepath, 'r') as file:
        return [i.strip() for i in file.readlines()]

 

 

2. 읽어온 파일을 변수에 담고, 딕셔너리를 활용해 '라벨' : '값' 형태로 바꾸기

file = readfile("./rosalind_gc.txt")    # 위에서 작성한 함수 이용해 파일 읽고, 읽은 내용 변수에 담기
dict = {}   # 키 : 값 담을 딕셔너리 생성
label = ""  # 라벨 담을 변수 만들기

for line in file:   # 파일에서 for문 돌리면서 하나씩 꺼내기
    if '>' in line: # 하나씩 꺼냈는데 '>' 가 포함되어 있다면
        label = line    # 그 단어는 라벨로 쓰기
        dict[label] = ""    # 그 라벨에 해당하는 value 값 비워두고

    else:
    # for문 돌면서 그 다음 인덱스로 옴-> 라벨아닌 염기서열 데이터. 위에서 비워둔 value 자리에 염기 서열 담기
        dict[label] += line

데이터가 많아서 사진을 잘랐지만  키 : 값 형태로 잘 담기고 있다!

 

 

 

3. GC 세는 함수 만들고, 결과가 담길 딕셔너리에 담기

def gc_content(seq):    # 시퀀스 입력 받아
    # 그 시퀀스에서 C와 G를 세어 길이로 나누고 100 곱하기. 소수점 7번째 자리에서 반올림하기
    return round((seq.count('C') + seq.count('G')) / len(seq) * 100, 6)
# 딕셔너리 값들을 꺼내고 for문을 돌려 키 : 값 형태로 넣기. 
# 이 때 딕셔너리 값을 위에서 작성한 gc 세는 함수에 넣어 가공하고, 
# 반환된 값을 결과 딕셔너리에 넣는다

result = {key:gc_content(value) for (key, value) in dict.items()}

 

 

 

4. max() 함수 활용해 value 값 중 가장 큰 값의 키 구하기

new = {'a':'1', 'b':'2', 'c':'3'}
print(new.get('c'))

이렇게 쓰면 

딕셔너리 new의 키 c의 값 '3'을 얻을 수 있다.

 

max 함수는 key와 default라는 매개 변수를 갖고 있다. 

key에 함수를 값으로 넣는다. lambda를 이용할 수 있다.

key= function을 기준으로 최대, 최솟값을 찾는다.

max_key = max(result, key=result.get)
print(f'{max_key}\n{result[max_key]}')

.get 메소드를 활용했다.

result 딕셔너리 내 value값이 가장 큰 키를 구한다.

프린트를 찍어 보면

print(max_key)

키 값이 잘 나온다!

 

 

키와 그 키에 해당하는 값도 프린트 해보자

print(f'{max_key}\n{result[max_key]}')

 

구하고자 하는 값이 잘 나왔다!

728x90