Given a list of values, we are interested to know at which position are the Boolean values present as a contiguous list. Which means after we encounter a value which is TRUE there is a continuous value of true from that position until FALSE value is found. Similarly when a FALSE is found there is a contiguous value of FALSE until TRUE is found.
With itertools
W can use accumulate along with groupby from the itertools module. In this example we take a given list and then apply the accumulate function to keep track of the values that are brought together using the sum function.The last value in the list is the last position where the given list ends.
Example
from itertools import accumulate, groupby # Given list listA = [False, True,True,False,False] print("Given list : \n",listA) # Applying accumulate res = [0] + list(accumulate(sum(1 for x in y) for x, y in groupby(listA))) # Result print("Positions for Range of contigous values:\n ",res)
Output
Running the above code gives us the following result −
Given list : [False, True, True, False, False] Positions for Range of contigous values: [0, 1, 3, 5]
Using enumerate
The enumerate function along with zip function is used to list the position by comparing each element with the next one. If they are not equal then a new position value is consideredas the staring point of the contiguous range.
Example
# Given list listA = [False, True,True,False,False] print("Given list : \n",listA) # Applying enumerate res = [e for e, (x, y) in enumerate(zip([2]+ listA, listA + [2])) if x != y] # Result print("Positions for Range of contigous values:\n ",res)
Output
Running the above code gives us the following result −
Given list : [False, True, True, False, False] Positions for Range of contigous values: [0, 1, 3, 5]