2013-06-06 68 views
0

所以我有一個函數,它需要以下內容:times =日期時間對象列表,start =日期時間對象,以及end =日期時間對象。和返回是datetime對象它能夠依然工作,如果start和/或end實際上不在datetime對象的列表之間開始和結束python中日期時間列表的索引估計

def func(times,start,end): 
    return times[start:end],(times.index(start),times.index(end)) 

我需要一個列表:times

所以,如果start不在列表中,它會採取即start「大於」的第一個項目,它會做同樣的,如果end不在列表中,除了這將是「小於」,而不是。

獲得實際起點終點的指數也是至關重要的。

什麼我添加到我的功能,將做到這一點?

+0

是你'times'當你調用排序'FUNC(倍,開始,結束)'? – fang

+0

是的,它總是會是 –

回答

1

您可以使用對開

import bisect 
def func(times, start, end): 
    bucket = [start, end] 
    out = [x for x in times if bisect.bisect(bucket, x) is 1 or x in bucket] 
    return out, (times.index(out[0]), times.index(out[-1])) 
+1

他需要結果中的索引 – fang

+0

times.index()總是返回第一個匹配項的索引。如果'times'列表有多個與'end'具有相同值的對象,則只有第一個對象被函數返回。 – fang

0

對這一問題的簡單方法:

def func(times, start, end): 
    s = 0 
    e = len(times)-1 

    while s < len(times) and times[s]< start: 
     s+=1 

    while e >= 0 and times[e] > end: 
     e-=1 

    if (e < 0 or s >= len(times) or s > e): 
     return None 

    return times[s:e+1], (s,e) 
-1

爲什麼不乾脆[dt for dt in times if dt >= start and dt <= end]