タプルはソートされているため、しきい値よりも低い値を持つ最初のタプルを検索し、スライス表記を使用して残りの値を削除するだけです。
index = next(i for i, (t1, t2) in enumerate(myTup) if t2 < threshold)
del myTup[index:]
Vaughn Catoが指摘しているように、二分探索は物事をさらにスピードアップします。ここbisect.bisect
に記載されているように、別のキーシーケンスを作成しない限り、現在のデータ構造では機能しないことを除けば、便利です。しかし、それは新しいリストを作成することの禁止に違反します。
それでも、独自のバイナリ検索の基礎としてソースコードを使用できます。または、データ構造を変更することもできます。
>>> myTup
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'),
(6, 'g'), (7, 'h'), (8, 'i'), (9, 'j')]
>>> index = bisect.bisect(myTup, (threshold, None))
>>> del myTup[:index]
>>> myTup
[(6, 'g'), (7, 'h'), (8, 'i'), (9, 'j')]
ここでの欠点は、Pythonがメモリのブロック全体を元に戻す必要があるため、線形時間で削除が発生する可能性があることです...Pythonがから始まるスライスの削除について賢明でない限り0
。(誰か知ってる?)
最後に、データ構造を本当に変更したい場合は、次のようにすることができます。
[(-9, 'a'), (-8, 'b'), (-7, 'c'), (-6, 'd'), (-5, 'e'), (-4, 'f'),
(-3, 'g'), (-2, 'h'), (-1, 'i'), (0, 'j')]
>>> index = bisect.bisect(myTup, (-threshold, None))
>>> del myTup[index:]
>>> myTup
[(-9, 'a'), (-8, 'b'), (-7, 'c'), (-6, 'd')]
(Python 3は比較について文句を言うので、代わりにNone
次のようなものを使用できることに注意してください。)(-threshold, chr(0))
私の疑惑は、最初に提案した線形時間検索がほとんどの状況で受け入れられるということです。