Vous pouvez utiliser un compréhension de la liste avec un expression de générateur et une combinaison de énumérer() y 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]]
D'abord, enumerate()
va construire des tuples à partir des éléments de la liste et de leur index respectif :
>>> [t for t in enumerate(l)]
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 7), (6, 8), (7, 9), (8, 11)]
Puis groupby()
regroupera ces tuples en utilisant la différence entre leur index et leur valeur (qui sera égale pour les valeurs consécutives) :
>>> [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),)]
À partir de là, il suffit de construire des listes à partir des valeurs du premier et du dernier tuples de chaque groupe (qui seront les mêmes si le groupe ne contient qu'un seul élément).
Vous pouvez également utiliser [(t[0][1], t[-1][1]) ...]
pour construire une liste de tuples de plage au lieu de listes imbriquées, ou même ((t[0][1], t[-1][1]) ...)
pour transformer l'expression entière en un itérable generator
qui construira paresseusement les tuples de la gamme à la volée.
0 votes
Eh bien, je peux dire avec assurance que je ne connais pas une telle fonction. Il est beaucoup plus difficile de dire avec certitude que quelque chose dont je n'ai pas connaissance n'existe pas.....
1 votes
Presque la même question a été posée et répondue dans stackoverflow.com/questions/3429510/
0 votes
Je pense que le résultat que vous proposez devrait en fait être une liste de plages cf. ma réponse ci-dessous !