您可以使用list comprehension 和generator expression 以及enumerate() 和itertools.groupby() 的组合:
>>> import itertools
>>> l = [0, 1, 2, 3, 4, 7, 8, 9, 11]
>>> [[t[0][1], t[-1][1]] for t in
... (tuple(g[1]) for g in itertools.groupby(enumerate(l), lambda (i, x): i - x))]
[[0, 4], [7, 9], [11, 11]]
首先,enumerate() 将根据列表项及其各自的索引构建元组:
>>> [t for t in enumerate(l)]
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 7), (6, 8), (7, 9), (8, 11)]
然后groupby() 将使用它们的索引和它们的值之间的差异对这些元组进行分组(对于连续值,这将是相等的):
>>> [tuple(g[1]) for g in itertools.groupby(enumerate(l), lambda (i, x): i - x)]
[((0, 0), (1, 1), (2, 2), (3, 3), (4, 4)), ((5, 7), (6, 8), (7, 9)), ((8, 11),)]
从那里,我们只需要从每个组的第一个和最后一个元组的值构建列表(如果组只包含一个项目,这将是相同的)。
您还可以使用[(t[0][1], t[-1][1]) ...] 来构建范围元组列表而不是嵌套列表,甚至可以使用((t[0][1], t[-1][1]) ...) 将整个表达式转换为可迭代的generator,这将在运行中懒惰地构建范围元组。