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

ただし、これは信じられないほど遅いです。最初の値でソートされていることがわかっているので、リスト全体をループするよりも高速な方法はありますか? 二分探索を実装しようと思っていたのですが、ソートされたタプルのリストを最適化したライブラリは既にありますか?

4

2 に答える 2

9

バイセクトモジュール

于 2012-04-25T10:57:31.187 に答える
2

これらの例を目的に合わせて調整できるはずです: http://docs.python.org/library/bisect.html#searching-sorted-lists。各関数で値を取得する代わりに、インデックスを返し、2 つのインデックスを使用して範囲を抽出できます。

于 2012-04-25T11:03:39.203 に答える