IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Compter efficacement en python


Sujet :

Python

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 11
    Par défaut Compter efficacement en python
    Bonjour,
    J'ai actuellement un problème dans mon code, je voudrais compter les occurrences des 'K' dans une chaine de caractère, le problème c'est que je dois faire la disctinction entre les 'K', les 'KK' et ainsi de suite. J'ai essayé avec re. mais il n'existe pas de fonction 'count'. J'ai donc essayé avec des simples compteurs et en gérant les exceptions mais ma boucle for va plus loin que prévu. Quelqu'un saurait comment faire ?
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    def k_content(sequence):
        cpt1 = 0
        cpt2 = 0
        cpt3 = 0
        for i in range(len(sequence)):
            try:
                if 'K' in sequence[i] and 'K' not in sequence[i+1] and 'K' not in sequence[i-1]:
                        cpt1 += 1
                        i += 1
            except (IndexError, ValueError):
                    cpt1 += 1
            try:
                if 'K' in sequence[i] and 'K' in sequence[i+1] and 'K' not in sequence[i-1] and 'K' not in sequence[i+2]:
                        cpt2 += 1
                        i += 2
            except (IndexError, ValueError):
                    cpt2 += 1
            try:
                if 'K' in sequence[i] and 'K' in sequence[i+1] and 'K' in sequence[i+2]:
                        cpt3 += 1
                        i += 3
            except (IndexError, ValueError):
                    cpt3 += 1
     
        print("Nombre de K : " + str(cpt1), "Nombre de KK : " + str(cpt2), "Nombre de KKK : " + str(cpt3))
        print("Pourcentage de K : " + str((cpt1/len(sequence))*100), "Pourcentage de KK : " + str((cpt2/len(sequence))*100), "Pourcentage de KKK : " + str((cpt3/len(sequence))*100))
    Merci d'avance

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Salut,

    Plusieurs compteurs devrait faire penser à liste de compteurs: compteurs[1] pour 1 K seul, compteurs[2] pour 2 K consécutifs, ... il y aura au plus len(sequence) compteurs.
    Reste à compter les K consécutifs.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 11
    Par défaut
    Merci pour ta réponse rapide wiztricks, tu crois qu'il est possible de faire la même chose avec une expression régulière ? Le problème c'est que re ne compte pas les doublons, ou bien je me trompe ?

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 11
    Par défaut
    Une autre solution à mon problème serait de pouvoir gérer l'index que parcourt la boucle for, c'est-à-dire une fois qu'elle rencontre 3 K consécutifs, l'idéal serait d'avancer à i+3, j'ai testé sur pythontutor et au début ça marche, par exemple mon index passe de 27 à 30 et à l'itération suivante il revient à 28. Tu vois ce que je veux dire ?

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Sinon simplement comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import re
     
    a='KaaaKKKKaaKK'
    lesK=re.findall('(K+)',a)
    print(lesK)
    qui donne quasiment le résultat voulu (reste plus qu'à parcourir cette liste de résultat et de compter en fonction des longueurs)

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Citation Envoyé par glageosa Voir le message
    Merci pour ta réponse rapide wiztricks, tu crois qu'il est possible de faire la même chose avec une expression régulière ? Le problème c'est que re ne compte pas les doublons, ou bien je me trompe ?
    Vu comment vous vous y prenez avec les boucles, il serait plus instructif pour vous d'essayer d'y arriver plutôt que d'utiliser (déjà) les expressions régulières. Et c'est pas si compliqué de parcourir la chaîne caractère par caractères d'avoir un compteur k qui passe de 0 à un lorsqu'il voit le premier K, s'incrémente lorsqu'il voit les K suivant, repasse à 0 lorsqu'il voit autre chose et stocke +1 dans compteurs[k].

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    Je propose quelque chose à mon tour, je suis pas sur que se soit le plus opti niveaux performances en théorie vus que sa travaille sur une copie, mais je ne pense pas que tu risque de compter des caractères dans plusieurs GO de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def count(char, seq):
    	liste = list(seq)
    	counter = 0
    	while char in liste:
    		counter += 1
    		liste.remove(char)
    	return counter
     
    print(count("x", "xx xxx t"))

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 11
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Sinon simplement comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import re
     
    a='KaaaKKKKaaKK'
    lesK=re.findall('(K+)',a)
    print(lesK)
    qui donne quasiment le résultat voulu (reste plus qu'à parcourir cette liste de résultat et de compter en fonction des longueurs)
    Merci pour ta réponse, c'est quasiment ce que je veux effectivement, en revanche je vois pas vraiment comment compter en fonction des longueurs, pourrai-tu être plus précis ?

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 11
    Par défaut
    Citation Envoyé par flapili Voir le message
    Je propose quelque chose à mon tour, je suis pas sur que se soit le plus opti niveaux performances en théorie vus que sa travaille sur une copie, mais je ne pense pas que tu risque de compter des caractères dans plusieurs GO de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def count(char, seq):
    	liste = list(seq)
    	counter = 0
    	while char in liste:
    		counter += 1
    		liste.remove(char)
    	return counter
     
    print(count("x", "xx xxx t"))
    Merci pour ta réponse flapili, cependant j'aimerais pouvoir faire la distinction entre un x, un xx et un xxx, dans ton exemple, l'idéal serait qu'en sortie on ait xx:1, xxx:1, tu vois ce que je veux dire ?

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 342
    Par défaut
    Bonjour,

    Un solution possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> import re
    >>> a='KKKaaKaKKaKK'
    >>> len(re.findall('[^K]K[^K]',re.sub('^|[^K]|$',"xx",a)))
    1
    >>> len(re.findall('[^K]KK[^K]',re.sub('^|[^K]|$',"xx",a)))
    2
    >>> len(re.findall('[^K]KKK[^K]',re.sub('^|[^K]|$',"xx",a)))
    1

  11. #11
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 11
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    Un solution possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> import re
    >>> a='KKKaaKaKKaKK'
    >>> len(re.findall('[^K]K[^K]',re.sub('^|[^K]|$',"xx",a)))
    1
    >>> len(re.findall('[^K]KK[^K]',re.sub('^|[^K]|$',"xx",a)))
    2
    >>> len(re.findall('[^K]KKK[^K]',re.sub('^|[^K]|$',"xx",a)))
    1
    Merci pour ta réponse, c'est effectivement ce que je recherchais mais je viens de trouver à l'instant. Quoi qu'il en soit je garde ton code qui me parait plutôt efficace, merci à toi.
    Merci à tout ceux qui ont répondu aussi rapidement, je peux à présent marquer ce topic comme résolut !

  12. #12
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    J'avais lu le sujet en diagonale, mais après une rapide correction de mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def count(char, seq, max_occurence=1):
    	string = str(seq)
    	counter = 0
    	for i in list(reversed(range(1, max_occurence+1))):
    		while char*i in string:
    			counter += 1
    			string = string.replace(char*i, "", 1)
    	return counter
     
    print(count("x", "x xx xxx t", 4))

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 342
    Par défaut
    Mais attention, mon code ne prend pas en compte les cas avec plus de 3 occurrences de K...
    KKKK par exemple ne sera pas comptabilisé que ce soit en K+KKK ou KK+KK

  14. #14
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 11
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Mais attention, mon code ne prend pas en compte les cas avec plus de 3 occurrences de K...
    KKKK par exemple ne sera pas comptabilisé que ce soit en K+KKK ou KK+KK
    Oui tkt pas j'ai vu, j'ai finalement réussis à créer un code plus générique, en mélangeant un peu vos réponses à tous :p, quoi qu'il en soit merci beaucoup à tout le monde.

  15. #15
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Salut,

    Autant poster le code!
    Pas si compliqué d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def compter(s, letter):
        counters = [0,] * len(s)
        k = 0
        for ch in s:
            if ch == letter:
                k += 1
            elif k > 0:
                counters[k] += 1
                k = 0
        if k > 0:
            counters[k] += 1
     
        return counters
    Bien sûr, avec "re" et "collections", on peut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import re
    >>> from collections import Counter
    >>> Counter(re.findall('K+', 'aKaKKbKKKcKKK'))
    Counter({'KKK': 2, 'K': 1, 'KK': 1})
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [python 2.7.6]Compter le temps
    Par unic0 dans le forum Général Python
    Réponses: 5
    Dernier message: 08/05/2016, 13h31
  2. distribuer (efficacement) du python sous win et linux
    Par membreComplexe12 dans le forum Général Python
    Réponses: 5
    Dernier message: 27/10/2014, 11h53
  3. Compter les lignes de code d'une source python
    Par yacinechaouche dans le forum Général Python
    Réponses: 6
    Dernier message: 18/06/2012, 10h12
  4. Compter le nombre ligne listée (COUNT) ?
    Par StouffR dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2002, 09h41
  5. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/06/2002, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo