2012-09-20 4 views
2

내가 다른 패턴스캔 독서 프레임 [3] 파이썬

sequence = 'TCATGAGGCTTTGGTAAATAT' 
을 찾기 위해 3의 배수에 가서, 그 순서에서 다음 특정 패턴을 감지하는 3의 독서 프레임을 사용 할 수있는 스크립트를 작성하려고 해요 (이것은 원하는 패턴 (즉, 'ATG')

을 찾을 때까지 ... (3)의 판독 프레임으로 스캔 위치를 상기 제 1 패턴의 위치를 ​​표시 ...

:

난에 필요한 'ATG')는 원래의 순서와 두 번째 패턴이 시작된 위치 ('TAA')에서 시작되었습니다. 이 경우 'ATG'는 3 위이고 'TAA'는 15 위입니다.

...이 제 2 패턴 'TAA'에 도달 할 때까지 상기 제 1 패턴을 따르는 각각의 트리플렛과리스트를 생성 (즉, 'ATG'를 'AGG', 'CTT'TGG ','TAA ')

독서 프레임을 3 세트로 읽으려면 어떻게 구성해야합니까? 나는 문이

reading_frame=[] 

for frame in sequence: 
    if k == 'ATG': 
     reading_frame.append(k) 

말을하면 내가가 만든 수 읽기를 얻을 수있는 방법을 발견하면 먼저 내가

답변

0
sequence = 'TCATGAGGCTTTGGTAAATAT' 

frame1 = sequence.find('ATG') 

my_list = [] 

for codon in range(len(sequence)): 
    next_codon = sequence[frame1:frame1+3] 
    my_list.append(next_codon) 
    frame1 +=3 
    if next_codon == 'TAA': 
     break 

print my_list 

[ 'ATG', 'AGG', 'CTT', 'TGG', 'TAA']

+0

왜 내가 을 설정할 때 next_codon == 'TAA'또는 'TAG'또는 'TGT가'경우이다 그러나, 당신은 next_codons가 다른 if 문을 더 추가 할 수 있습니다. –

+0

내가 왜 확실 미안하지 않다 소요 :(작동하지 않습니다 – chimpsarehungry

1

은 쉽게가 것입니다, sequenceATG의 첫 번째 위치를 찾으려면 읽기 프레임이 필요하다는 것을 알고있다 멀리 :

>>> sequence.find('ATG') 

예에서 패턴 위치의 인덱스는 2입니다. 그리고, 바로 그 위치 이후의 제 2 패턴을 찾아 :

>>> idx_1 = sequence.find('ATG') 
>>> idx_2 = sequence[idx_1:].find('TTA') 

합니다 (sequence[idx_1:] 위치 idx_1sequence의 요소를 리턴). idx_2이 당신은 할 수 있습니다 즉, 원래의 목록에 패턴 2의 실제 위치가 idx_2+idx_1입니다. 패턴을 찾을 수없는 경우 .find 방법은 돌려 보낼 -1 주입니다. (idx_1에 의해 상쇄되는 것을 염두에

유지 . 쉽게 그 예를 다음과 같은 패턴 목록을 반복 할 수

>>> subsequence = sequence[idx_1:idx_2+idx_1] 
>>> [subsequence[i:i+3] for i in range(0, len(subsequence), 3)] 

:이 경우를 다루는 몇 가지 테스트를 추가 할

당신은이 패턴을 발견하면, 당신은 중개인의 목록을 구성 할 수 있습니다.

idx_1%3 == 0, 즉 idx_1이 3의 배수인지 확인해야 할 수도 있습니다 (첫 번째 프레임이 0에서 시작한다고 가정). 그렇지 않다면 최소한 서열의 시작 부분은 버려야한다는 것을 알고 있습니다.

+0

I이 늘이 necessarilly 작동 생각 ... DNA 3 및 ATG의 프레임에서 판독되므로 2 프레임을 확장 할 수 있습니다 ... –

+0

@JoranBeasley : 꽤 사실입니다. 'idx_1'가 3의 배수인지 확인하기 위해 다른 테스트를 추가 할 수 있습니다 (물론 첫 번째 프레임이 0에서 시작한다고 가정). –

+0

하지만 그게 아직 나중의 일치를 배제하지 않는다면 ... 나는 이것이 빠르게 i % 3 == 0이되도록 너무 복잡해진다 고 생각합니다 ... –

2

당신은 3 요소의 시리즈로 sequence를 분해하여 시작할 수는 당신이 첫 번째 패턴을 찾을 때까지

sequence = 'TCATGAGGCTTTGGTAAATAT' 
frames = [sequence[i:i+3] for i in range(0,len(sequence),3)] 
print "Frames:",frames 
frames_before_ATG,frames_after_ATG = frames[:frames.index("ATG")],frames[frames.index("ATG")+1:] 

는 그 다음 frames 목록에 반복 프레임.

+0

'ATG'를 만나면 시작해야합니다. –

+0

이 접근법은 분명 더 많은 작업으로 보일 수 있지만 실제로는 스크립트를 사용하면 메모리를 초과 할 수있는 데이터를 기가 바이트로 제공하지 않는 한 가장 좋습니다 (가장 빠른 것은 아닙니다). . 이 방법은 빠르며 시작/종료 코돈이 동일한 프레임에 있는지 확인합니다. 또한 중첩 된 읽기 프레임을 찾는 작업을 단순화 할 수 있습니다.이 프레임은 이전 작업이 완료되기 전에 시작됩니다 (이것은 바이러스와 박테리아에서 일반적입니다). 은 휴식 그것은 단지 'ATG' – DaveTheScientist