2012-04-25 5 views
0

튜플의 큰 정렬 된 목록에서 항목의 범위를 얻는 것은 다음과 같습니다이 :내가 튜플의 목록을 가지고

[(334.99972431901307, 0.0), (335.00088248902574, 0.0), (335.0020406650446, 0.0), (335.0031988470696, 66.83868408203125), (335.00435703510072, 252.91905212402344), (335.0055152291381, 341.447509765625), (335.00667342918183, 282.1964111328125), (335.0078316352317, 125.92335510253906), (335.00898996725408, 0.0), (335.01014818531672, 0.0)] 

목록은 16665의 길이와 각 튜플의 첫 번째 요소에 정렬됩니다 . 첫 번째 튜플 값을 기반으로 목록에서 특정 범위의 튜플을 추출하려고합니다. 현재로서는 이렇게하고 있습니다.

def getSpectra_mzWindow(self, mzStart, mzEnd): 
    for spectrum in self.mzmlInstance: 
     # loop through all the peaks 
     for peak in spectrum.peaks: 
      # it's ordered, so when peak[0] > mzEnd it can stop 
      if float(peak[0]) > mzEnd: 
       break 
      if mzStart <= float(peak[0]) <= mzEnd: 
       yield spectrum, peak 

그러나 이것은 매우 느립니다. 내가 처음 값으로 정렬되어 있다는 것을 알고 있기 때문에 전체 목록을 반복하는 것보다 빠른 방법이 있습니까? 바이너리 검색을 구현할 생각 이었지만 이미 정렬 된 튜플 목록에 최적화 된 라이브러리가 있습니까?

답변

9

bisect 모듈

+0

그래도 튜플의 모든 첫 번째 값을 목록에 넣고 목록을 가져 와서 색인을 얻으면 튜플 목록으로 돌아가 올바른 튜플을 얻지 않아도됩니까? –

+0

@NiekdeKlein, 당신은 아마도'(mzStart, 0.0)' –

+0

과 같은 튜플을 검색 할 수 있습니다. bisect.bisect_left (lst, (mzStart,)) –

관련 문제