由於元組進行排序,你可以簡單地搜索
index = next(i for i, (t1, t2) in enumerate(myTup) if t2 < threshold)
del myTup[index:]
作爲斯沃恩卡託指出的,一個二進制搜索將加快速度甚至米:與低於閾值的值,然後第一元組使用切片符號刪除其餘的值礦石。 bisect.bisect
會很有用,除非您創建一個單獨的密鑰序列(如文檔here),否則它將不適用於您當前的數據結構。但這違反了你禁止創建新的列表。
不過,您可以使用source code作爲您自己的二進制搜索的基礎。或者,你可以改變你的數據結構:
>>> 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))
的東西代替。)
我懷疑我在一開始提到的線性時間搜索在大多數情況下是可以接受的。
由於您的列表已經排序:如何首先進行[二進制搜索(http://en.wikipedia.org/wiki/Binary_search_algorithm)找到低於閾值的第一個元組的索引。 –