50 votes

convertir une liste d'entiers en plage en python

Existe-t-il quelque chose en python qui puisse convertir une liste croissante d'entiers en une liste d'intervalles ?

Par exemple, étant donné l'ensemble {0, 1, 2, 3, 4, 7, 8, 9, 11} je veux obtenir {0,4}, {7,9}, {11,11} }.

Je peux écrire un programme pour le faire, mais je voudrais savoir s'il existe une fonction intégrée dans Python.

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 !

3voto

Konchog Points 544

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)]

2voto

smichr Points 671

Questions connexes pour le cas où des tailles de pas autres que 1 sont intéressantes et une question presque identique à celle-ci ici . Une solution performante pour l'un ou l'autre cas est donnée ici .

1voto

Mark Loeser Points 4007

Rien d'intégré, ni dans aucune bibliothèque que je connaisse. Ce n'est pas très utile, je sais, mais je n'ai jamais rencontré quelque chose comme ce que vous voulez.

Voici quelques idées pour votre programme au moins (en C++, mais cela peut vous donner d'autres idées) :

Conversion d'ensembles d'entiers en plages

1voto

Akhil Points 578

Dans le cas où il n'y a pas de telle fonctionnalité dans python, voici une implémentation

p = []
last = -2                                                            
start = -1

for item in list:
    if item != last+1:                        
        if start != -1:
            p.append([start, last])
        start = item
    last = item

p.append([start, last])

1voto

Neuer Points 19

Mettez-le plus court :

ranges=lambda l:map(lambda x:(x[0][1],x[-1][1]),map(lambda (x,y):list(y),itertools.groupby(enumerate(l),lambda (x,y):x-y)))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X