Partage
  • Partager sur Facebook
  • Partager sur Twitter

Nombres consécutifs dans une liste

11 juin 2016 à 17:44:02

Bonjour tout le monde,

Je souhaiterai compter dans une liste contenant des 0 et des 1 les groupes consécutifs de 1 dans une liste. Je m'explique :

pour [0,1,0,0,0] je voudrai trouver : [1] --> il y a 1 groupement de 1 fois "1"

pour [0,0,1,1,0] je voudrai trouver : [2] --> il y a 1 groupement de 2 fois "1"

pour [1,1,0,1,1] je voudrai trouver : [2,2] --> il y a 2 groupements de 2 fois "1"

Est-ce que vous pourriez m'aider à faire sortir ce résultat ? J'ai d'abord penser partir sur des boucles s’arrêtant au premier 1 rencontré, mais je n'arrive pas à compter le nombre de "1" consécutifs. En plus à chaque fois qu'un groupement est terminé il faudrait créer une autre variable pour le prochain groupement, et je ne vois pas comment faire sachant que le nombre de groupement n'est pas identique suivant la liste...

Désolé des explications peu claires, ce n'est pas facile à expliquer. Si vous n'avez pas compris n'hésitez pas à me le dire, j'essaierai de reformuler.

Merci d'avance.

-
Edité par Takoza 11 juin 2016 à 17:44:27

  • Partager sur Facebook
  • Partager sur Twitter
11 juin 2016 à 19:10:28

Voici comment je ferai:

  • Créer une liste vide lst_cpt qui va contenir les compteurs
  • Créer une variable cpt et l'initialiser à 0
  • Ensuite, je boucle pour la liste qui contient les 0 et les 1
  • Si c'est 1, j'ajoute +1 à cpt.
  • Si c'est 0, je fais une vérification supplémentaire. Je regarde si cpt est supérieur à 0. Si c'est le cas, je l'ajoute à lst_cpt et je remet cpt à 0.
  • En sortie de boucle, je refais la vérification sur cpt pour savoir s'il est supérieur à 0. Si c'est le cas, de nouveau je l'ajoute à lst_cpt

.

Ya peut-être plus simple, mais je vois pas dans l'immédiat :o

  • Partager sur Facebook
  • Partager sur Twitter
Précepte: Le mieux est l'ennemi du bien
11 juin 2016 à 19:10:40

Bonjour,

Tout dépend du problème initial que tu as à résoudre.

Si cette fonction constitue un exercice d'algorithmique à part entière, continue sur ta lancée : tu itères sur ta liste avec un compteur. Chaque fois que tu rencontres un 1, tu augmentes le compteur. Chaque fois que tu rencontres un 0, tu insères la valeur du compteur dans une liste de résultats, puis tu réinitialises ce compteur. N'oublie pas de procéder de même une fois toute la liste parcourue, pour les cas où tu n'as pas de 0 en fin de liste et donc que la dernière valeur du compteur n'est pas prise en compte.

En revanche, si elle n'est qu'un outil dont tu as besoin pour un problème plus conséquent, je te propose une solution à base de groupby du module itertools, qui va ici nous permettre de regrouper les valeurs identiques consécutives de ta liste.

>>> from itertools import groupby
>>> def groups(l):
...     return [sum(g) for i, g in groupby(l) if i == 1]
...
>>> groups([0,1,0,0,0])
[1]
>>> groups([0,0,1,1,0])
[2]
>>> groups([1,1,0,1,1])
[2, 2]
  • Partager sur Facebook
  • Partager sur Twitter
13 juin 2016 à 13:45:05

Bonjour,

Merci beaucoup pour vos réponses, je vais essayer de mettre cela en place.

Entwanne : Oui en effet ce serait une petite fonction que j'utilise pour quelque chose de plus gros, mais relativement modeste donc je me contenterai de la première solution. Concernant la deuxième, je ne connais pas le module, j'y jetterai un oeil, merci.

  • Partager sur Facebook
  • Partager sur Twitter
24 juin 2018 à 21:12:22 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


24 juin 2018 à 21:47:26

Tu aurais pu faire ton propre sujet pour ce problème. Mais quel est ton code actuel ?

  • Partager sur Facebook
  • Partager sur Twitter
25 mars 2020 à 14:57:29 - Message modéré pour le motif suivant : Merci de créer votre propre sujet