è possibile utilizzare un list comprehension con un generator expression e una combinazione di enumerate() e 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]]
Innanzitutto, enumerate()
costruirà tuple dalle voci di elenco e il loro rispettivo indice:
>>> [t for t in enumerate(l)]
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 7), (6, 8), (7, 9), (8, 11)]
Poi groupby()
volontà gruppo tali tuple utilizzando la differenza tra il loro indice e il loro valore (che sarà uguale per valori consecutivi):
>>> [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),)]
da lì, abbiamo solo bisogno di costruire liste dai valori della prima e dell'ultima tuple di ogni gruppo (che sarà lo stesso se il gruppo contiene un solo articolo).
È inoltre possibile utilizzare [(t[0][1], t[-1][1]) ...]
per costruire una lista di tuple gamma invece di liste annidate, o anche ((t[0][1], t[-1][1]) ...)
di trasformare l'intera espressione in un iterabile generator
che pigramente costruire le tuple gamma al volo.
Quasi la stessa domanda è stato chiesto e ha risposto in http://stackoverflow.com/questions/3429510/pythonic-way-to-convert-a-list-of-integers-into-a-string-of -comma-range-range/3430231 # 3430231 – Apalala
'>>> import this' – Apalala
Bene, posso dire con certezza che non conosco tale funzione. È molto più difficile dire con certezza che qualcosa di cui non sono a conoscenza non esiste ... –