2012-06-28 23 views
0

根據'親密度',有沒有方法根據list獲取上一個項目?例如:Python:根據親密度從列表中獲取上一個項目

[  Range(start=datetime.datetime(2012, 1, 1, 0, 0, 0), end=datetime.datetime(2012, 1, 15, 0, 0, 0)), 
     Range(start=datetime.datetime(2012, 2, 1, 0, 0, 0), end=datetime.datetime(2012, 2, 15, 0, 0, 0)), 
     Range(start=datetime.datetime(2012, 3, 1, 0, 0, 0), end=datetime.datetime(2012, 3, 15, 0, 0, 0))] 

以上是含有namedtuple S(稱爲Range)一個list,每個包含的開始日期和結束日期。

我知道這可以使用循環等以線性方式完成,但我想知道它是否可以更有效地完成?

實施例的輸入/輸出

如果我輸入datetime.datetime(2012, 1, 3, 0, 0, 0),它應該返回最接近的前面的開始日期時間:

Range(start=datetime.datetime(2012, 1, 1, 0, 0, 0), end=datetime.datetime(2012, 1, 15, 0, 0, 0)) 

如果我輸入,它應該返回與上述相同的:

Range(start=datetime.datetime(2012, 1, 1, 0, 0, 0), end=datetime.datetime(2012, 1, 15, 0, 0, 0)) 

如果我輸入datetime.datetime(2012, 2, 14, 0, 0, 0),應該返回:

Range(start=datetime.datetime(2012, 2, 1, 0, 0, 0), end=datetime.datetime(2012, 2, 15, 0, 0, 0)) 
+0

@MartijnPieters有一個腦f,然後,糾正 – johneth

回答

2

如果實現__lt____cmp__Range對象,你可以這樣做:

import bisect 
position = bisect.bisect_left(range_list, your_input) 
if position > 0:  
    nearest_range = range_list[position - 1] 
else: 
    nearest_range = None 

這當然,假設您的列表已經排序。

相關問題