我有一个列表如下:

Values = [0,0,1,1,1,1,1,2,2,2,3,3,3,3,3,3,4,4,4,5,5,5,5]

我想根据这些值得到索引范围例如,对于值“0”,我希望得到:
IndexRange0 = range(0,2) = [0,1]
#the element "0" is taking the positions 0 and 1 of the list "Values"

对于值“1”,我想得到:
IndexRange1 = range(2,7) = [2,3,4,5,6]

等。
最后,我想得到一个“这些范围的列表”,比如:
FinalOutput = [IndexRange0, IndexRange1, .... IndexRange5]

我不知道如何做到这一点,而不使用昂贵的建设与循环和坏的工作周围知道吗?
注:数字总是在逐步增加。范围的长度是变量(这次有2个“0”,下次可能是5等),但它的顺序总是一个接一个地增加(将有一组0,然后是一组1,然后是一组2等,直到一个非固定整数n)。提前谢谢你的帮助。

最佳答案

我建议要么bisect要么itertools.takewhile,这取决于您打算如何使用它。
对分:

import bisect

def index_range(n, lst):
    return (bisect.bisect_left(lst, n), bisect.bisect_right(lst, n))

def final_output(rng, lst):
    return [index_range(n, lst) for n in rng]

values = [0,0,1,1,1,1,1,2,2,2,3,3,3,3,3,3,4,4,4,5,5,5,5]
print(final_output(range(0,6), values))

给予
[(0, 2), (2, 7), (7, 10), (10, 16), (16, 19), (19, 23)]

10-07 13:49