Search code examples
pythonlistdatetimeintervals

interval in python


I have sorted list of datetime.time and want to create intervals like. If I have

a = [datetime.time(0,0), datetime.time(8,0), datetime.time(13,0), datetime.time(17,0)]

Then result should be like this:

c = [[datetime.time(0,0),datetime.time(8,0)], [datetime.time(8,0),datetime.time(13,0)],
[datetime.time(13,0),datetime.time(17,0)], [datetime.time(17,0),datetime.time(0,0)]]

This could be achieved using simple loop but if there is better solution exist?

Using loop:

>>> a=[datetime.time(0, 0), datetime.time(3, 0), datetime.time(8, 0), datetime.time(11, 0)]
>>> 
>>> r = []
>>> 
>>> for i in range(0,len(a)):
...     if i+1 < len(a):
...         r.append([a[i],a[i+1]])
...     else:
...         r.append([a[i],a[0]])
... 
>>> r
[[datetime.time(0, 0), datetime.time(3, 0)], [datetime.time(3, 0), datetime.time(8, 0)], [datetime.time(8, 0), datetime.time(11, 0)], [datetime.time(11, 0), datetime.time(0, 0)]]
>>> 

nd what could be change if I want result to be

[[datetime.time(0, 0), datetime.time(2, 59, 59)], [datetime.time(3, 0), datetime.time(7, 59, 59)], [datetime.time(8, 0), datetime.time(10, 59, 59)], [datetime.time(11, 0), datetime.time(23, 59, 59)]]

Solution

  • You could try

    a = list(zip(a[:-1], a[1:]))
    a.append((a[-1], a[0])])
    

    That gives you a list of tuples. If you want a list of lists, just do

    >>> a = [list(i) for i in zip(a[:-1], a[1:])]
    >>> a.append([a[-1], a[0]])
    

    (Edited version taking 1. the [a[-1],a[0]] out of the list comprehension and 2. the fact that zip doesn't return a list in Python 3+)

    Yet another possibility would be to just append the first value to the list:

    >>> tmp = a + a[0]
    >>> list(zip(tmp[:,-1], tmp[1:]))
    

    It can be argued that it creates a temporary list. You could do aa.append(a[0]) instead but then you'd modify your initial list, which might be an issue.