Comme il n'y a pas eu de nouvelle réponse depuis environ 2 ans, en voici une pour les amateurs de zombies !
Si vous ne voulez pas utiliser itertools ou un générateur, ce qui suit utilise la logique( !). Il utilise un ensemble (cf. la question !) en entrée et renvoie une liste d'intervalles appropriés comme résultat ; il est assez facile d'adapter le code pour qu'il convienne.
def ranges(l_set: set) ->list:
rb_set = sorted(l_set - {i +1 for i in l_set})
re_set = sorted(l_set - {i -1 for i in l_set})
return [range(rb_set[i], re_set[i]+1) for i in range(len(rb_set))]
Par exemple :
>>>ranges({6, 9, 10, 7, 8, 2, 3, 14})
[range(2, 4), range(6, 11), range(14, 15)]
>>>ranges({6, 7, 3, 15, 8, 5, 12, 0, 12, 7, 15, 6, 14, 8, 16})
[range(0, 1), range(3, 4), range(5, 9), range(12, 13), range(14, 17)]
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 !