2015-01-05 4 views
1

현재 MIT OCW의 문제 세트 중 하나를 통해 작업 중이며, 작업은 DNA 시퀀스에서 일치하는 하위 문자열을 찾는 것입니다.파이썬의 생성자 함수

길이 k의 서브 시퀀스를 반환하는 함수를 작성하는 데 어려움을 겪고 있습니다. 문자열을 사용할 때 작동하도록 할 수는 있지만 문제는 반복기를 사용하여 설정됩니다. 반복기를 사용할 때 함수는 yield를 사용하여 원래 위치로 돌아 가지 않고 항상 다시 설정되는 것처럼 보입니다. 여기

문자열을 사용하는 내가 쓴 올바른 기능입니다 :

def subs(seq, k): 
    subseq = '' 
    pos = 0 
    while pos < len(seq): 
     while len(subseq) < k: 
      subseq += seq[pos] 
      pos += 1 
     yield subseq, pos - k 
     subseq = subseq[1:] 

정답 :

>>> a = 'hello' 
>>> b = subs(a,2) 
>>> b.next() 
('he', 0) 
>>> b.next() 
('el', 1) 
>>> b.next() 
('ll', 2) 
>>> b.next() 
('lo', 3) 
>>> b.next() 

Traceback (most recent call last): 
    File "<pyshell#13>", line 1, in <module> 
    b.next() 
StopIteration 

내 문제 작업은을 사용하여 설정

긴 문자열 시퀀스에서 반복자를 만드는 클래스입니다. 여기서는 다루지 않겠지 만 주어진 테스트는 문자열에서 반복자를 만듭니다

# This test case may break once you add the argument m (skipping). 
class TestExactSubmatches(dnaseq.unittest.TestCase): 
    def test_one(self): 
     foo = 'yabcabcabcz' 
     bar = 'xxabcxxxx' 
     matches = list(dnaseq.getExactSubmatches(iter(foo), iter(bar), 3, 1)) 
     correct = [(1,2), (4,2), (7,2)] 
     self.assertTrue(len(matches) == len(correct)) 
     for x in correct: 
      self.assertTrue(x in matches) 

내 현재 솔루션 :

def subsequenceHashes(seq, k): 
    subseq = '' 
    pos = 0 
    print 'Start of subseqHashes' 
    try: 
     while True: 
      while len(subseq) < k: 
       subseq += seq.next() 
       pos += 1 
      print subseq, pos - k 
      yield hash(subseq), pos - k 
      subseq = subseq[1:] 
    except StopIteration: 
     return 

는, 서브 시퀀스의 해시를 얻을 서브 순서가 사전 (클래스 multidict)로 시작하는 위치의 위치와 함께 그들을두고 호출 기능 및 동일한 해시를 사용하여 부분 문자열을 비교하여 동일한 지 확인합니다. 그런 다음 동일한 하위 문자열 문자열에서 위치 쌍을 반환해야합니다. 나는이 기능의 시작에 문제가있어서 대부분의 기능을 디버그 할 수 없었다. 내가 테스트를 실행하면 어떻게됩니까

def getExactSubmatches(a, b, k, m): 
    # a and b are the strings compared, k is the length of substring, parameter m is unused, need it for later on in the problem set 
    ahash, apos = subsequenceHashes(a, k).next() 
    bhash, bpos = subsequenceHashes(b, k).next() 
    multidict = Multidict() 
    print 'starting' 
    while ahash: 
     print 'iterate' 
     multidict.put(ahash, ('a', apos)) 
     ahash, apos = subsequenceHashes(a, k).next() 
     print apos 
    while bhash: 
     multidict.put(bhash, ('b', bpos)) 
     bhash, bpos = subsequenceHashes(b, k).next() 
    for key in multidict.mydict: 
     if len(multidict.get(key)) > 1: 
      for t in multidict.get(key): 
       if t[0] == 'a': 
        for s in multidict.get(key): 
         if s[0] == 'b': 
          if a[apos:apos+k] == b[bpos:bpos+k]: 
           print apos, bpos 
           yield apos, bpos 

:

그것의 몸에서 반복자 등을 받았을 때 subsequenceHashes 난 다음 내용을 (사용할 때마다) 재설정되고 있습니다 잘못되어 가고있는 것 같다 무엇
Start of subseqHashes 


yab 0 
Start of subseqHashes 


xxa 0 
starting 
iterate 
Start of subseqHashes 


cab 0 
0 
iterate 
Start of subseqHashes 


cab 0 
0 
iterate 
Start of subseqHashes 


F.. 
====================================================================== 
FAIL: test_one (__main__.TestExactSubmatches) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "C:\Users\Alex\Desktop\Pythonwork\6.006\ps4\dist\test_dnaseq.py", line 32, in test_one 
    self.assertTrue(len(matches) == len(correct)) 
AssertionError: False is not true 

문자열을 사용할 때 루프에 머무르는 것에 반대합니다.

+1

예를 들어 전화를 걸 때마다 'subsequenceHashes (b, k)'다시 시작됩니다. 함수를 시작할 때 한 번 만들어야합니다. – jonrsharpe

+0

내가 비교할 DNA의 염기 서열은 수천만 개의 뉴클레오티드 길이이며 문제 세트는 제네레이터 기능을 만드는 것이 좋습니다. http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/assignments/MIT6_006F11_ps4.pdf – Az00123

+0

예,하지만 전화 만하면됩니다. 발전기 기능은 한 번 *. 그 후에, 당신은 * 그것을 계속 반복하고 싶을뿐입니다 *. 'gen_a = subsequenceHashes (a, k)'로 시작해서 거기에서부터 시작하십시오. – jonrsharpe

답변

0

@jonrsharpe 언급했듯이, 내 실수는 여러 번 생성기 함수를 호출하고 실제로 그것을 반복하지 않았습니다.