Is there a way to get the previous item in a list, based on ‘closeness’? For example:
[ 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))]
Above is a list containing namedtuples (called Range), each containing a start date and an end date.
I know that this can be done in a linear way using loops etc., but I was wondering if it could be done more efficiently?
Example input/output:
If I input datetime.datetime(2012, 1, 3, 0, 0, 0), it should return the closest previous start datetime:
Range(start=datetime.datetime(2012, 1, 1, 0, 0, 0), end=datetime.datetime(2012, 1, 15, 0, 0, 0))
If I input datetime.datetime(2012, 1, 27, 0, 0, 0), it should return the same as above:
Range(start=datetime.datetime(2012, 1, 1, 0, 0, 0), end=datetime.datetime(2012, 1, 15, 0, 0, 0))
If I input datetime.datetime(2012, 2, 14, 0, 0, 0), it should return:
Range(start=datetime.datetime(2012, 2, 1, 0, 0, 0), end=datetime.datetime(2012, 2, 15, 0, 0, 0))
If you implement
__lt__or__cmp__for yourRangeobject, you can do:This, of course, assumes that your list is already sorted.