2012-04-25 48 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

難道我仍然需要循環遍歷列表,將元組的所有第一個值放入列表中以獲取索引,以返回元組列表以獲取正確的元組? – 2012-04-25 12:56:38

+0

@NiekdeKlein,你可以像'(mzStart,0.0)一樣搜索一個元組'' – 2012-04-25 13:11:03

+0

cool它適用於bisect.bisect_left(lst,(mzStart,)) – 2012-04-25 13:29:42

相關問題