Można użyć list comprehension z generator expression i kombinacji enumerate() i 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]]
pierwsze enumerate()
zbudują krotki z elementami list a ich odpowiednie współczynniki:
>>> [t for t in enumerate(l)]
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 7), (6, 8), (7, 9), (8, 11)]
Następnie groupby()
będzie grupy te krotki, wykorzystując różnicę między indeksie i wartości (która będzie taki sam dla kolejnych wartości)
>>> [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),)]
Stamtąd, tylko trzeba zbudować list od wartości pierwszej i ostatniej krotki z każdej grupy (który będzie taki sam, jeśli grupa zawiera tylko jedną pozycję).
Można również użyć [(t[0][1], t[-1][1]) ...]
zbudować listę krotek Zakres zamiast zagnieżdżonych list, a nawet ((t[0][1], t[-1][1]) ...)
obrócić całe wyrażenie w iterowalny generator
która leniwie wybudować krotki gama na bieżąco.
Prawie to samo pytanie zostało zadane i odpowiedzi http://stackoverflow.com/questions/3429510/pythonic-way-to-convert-a-list-of-integers-into-a-string-of -comma-separ-range/3430231 # 3430231 – Apalala
'>>> import this' – Apalala
Cóż, mogę powiedzieć z przekonaniem, że nie znam takiej funkcji. O wiele trudniej jest powiedzieć z przekonaniem, że coś, czego nie znam, nie istnieje ... –