我有一个元组列表,如下所示:
[(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 18:57:31
bisect模块
发布于 2012-04-25 19:03:39
您应该能够根据您的目的修改这些示例:http://docs.python.org/library/bisect.html#searching-sorted-lists。您可以返回索引,然后使用这两个索引来提取您的范围,而不是检索每个函数中的值。
https://stackoverflow.com/questions/10314145
复制相似问题