我有一个元组列表的大排序列表:看起来像这样获得的各类物品的元组
[(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
但是,这是令人难以置信的缓慢。既然我知道它是按照第一个值排序的,那么有没有比循环遍历整个列表更快的方法呢?我正在考虑实现二分搜索,但是是否已经有一个库已经对已排序的元组列表进行了优化?
难道我仍然需要循环遍历列表,将元组的所有第一个值放入列表中以获取索引,以返回元组列表以获取正确的元组? – 2012-04-25 12:56:38
@NiekdeKlein,你可以像'(mzStart,0.0)一样搜索一个元组'' – 2012-04-25 13:11:03
cool它适用于bisect.bisect_left(lst,(mzStart,)) – 2012-04-25 13:29:42