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 :

Script affichant la fréquence d'apparition des caractères d'une phrase.


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Script affichant la fréquence d'apparition des caractères d'une phrase.
    Salut les gars. Je suis plutôt un débutant en python. J'essaye de reproduire un programme que j'avais une fois fais en C.
    En théorie mon code devrait marcher mais je ne maîtrise pas trop c'est truc avec l'indentation. Il y'a une erreur qu'on m'affiche.
    Et de plus je n'arrive pas à la corriger. Et pour tout couronner le IDLE que j'utilise considère que je maintient le boutton contrôle appuyé, ce qui m'empêche de taper. quand je fais A lui il lis ctrl+A. Bon là n'est pas le problème. Mon code on y revient.
    Si vous pouvez le corriger et me donner des idée...

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #!/usr/bin/python
    # -*- coding: latin-1 -*-
     
    #python v-3
     
    print("Ce programme analysera une phrase entrée par vous\n"
    	+ "et vous affichera la fréquence d'apparition de chaque lettre.\n")
     
    phrase = input("Veuillez taper votre phrase: ")
    lenPhrase = len(phrase)
     
    noRepeatLettre = ""
    lenNoReLe = len(noRepeatLettre)
    #On cré une autre chaîne 
    #il n'y a pas de répétition de charactère
    for i in phrase :
    	exist = False
    	if lenNoReLe == 0 :
    		noRepeatLettre = str(i)
    	for j in noRepeatLettre :
    		if i == j :
    			exist = True
    			break
    	if exist == False :
    		noRepeatLettre = noRepeatLettre + str(i)
    		lenNoReLe += 1
    #Si tout se passe bien noRepeatLettre est prêt
     
    if lenPhrase != 0 :
        print("\nVous avez tapé:\n", phrase)
        print("\nVoiçi la fréquence des caractères:\n")
     
        for i in noRepeatLettre :
            nbre = phrase.count(str(i))
        	print(str(i))
        	print(str(nbre)
        	print(" / ")
        	print(str(lenNoReLe))
    else :
    	print("\nVous n'avez rien entré.\n")
     
    print("--Au revoir !!!---")
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Ton code est bien compliqué sauf à souhaiter recoder des fonctions de bases de Python. Il existe une méthode count() sur les chaines. Tu peux donc obtenir un code très compact :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    s = "une phrase"
    for c in s:
    	print("{} is found {} times".format(c,s.count©))

    Quand j'exécute ton code, le message est clair :
    TabError: inconsistent use of tabs and spaces in indentation
    Tu mélanges les tabulations et les espaces pour indenter ton code. Tu devrais utiliser 4 espaces pour changer de niveau.

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Le code de konrad456 est encombré par la création préalable de la liste des lettres différentes de la phrase.
    Afin d'éviter ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    >>> for l in "element":
    ...     print('%s est présent %s fois' % (l, "element".count(l)))
    ... 
    e est présent 3 fois
    l est présent 1 fois
    e est présent 3 fois    # A déjà été compté !
    m est présent 1 fois
    e est présent 3 fois    # A déjà été compté !
    n est présent 1 fois
    t est présent 1 fois
    Mais c'est clair que Python est beaucoup plus simple que cela.

    Trois exemples basiques:
    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
    28
    29
    30
    31
    32
    33
    34
    35
     
    def count_letters(words):
        """Méthode académique. """
        letters = {}
        for l in words:
            # L'instruction conditionnelle n'est pas indispensable
            if not l in letters:
                letters[l] = words.count(l)
     
        return letters
     
    def count_letters_2(words):
        """Variante si words est un texte particulièrement long. """
        letters = {}
        while words:
            l = words[0]
            letters[l] = words.count(l)
            words = words.replace(l, '')
     
        return letters
     
    def count_letters_3(words):
        """Variante "j'suis pas payé à la ligne". """
        return ({k: words.count(k) for k in words})
     
    one = count_letters('chapitre premier')
    two = count_letters_2('chapitre premier')
    three = count_letters_3('chapitre premier')
     
    for res in (one, two, three):
        keys = sorted(res.keys())
        for k in keys:
            print(' "%s" est présent %s fois' %(k, res[k]))
     
        print()

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    On oublie souvent la solution existante de la classe Counter, qui est fait pour cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> from collections import Counter
    >>> Counter("une phrase")
    Counter({'e': 2, 'u': 1, 'a': 1, ' ': 1, 's': 1, 'r': 1, 'n': 1, 'h': 1, 'p': 1})
    Bonne continuation...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Il était tard et je n'avais pas vu le petit défaut de ma solution....

    Pour obtenir la liste des lettres, cette méthode est aussi simple à mettre en oeuvre (je ne connais pas sa performance en revanche) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> s = "toto"
    >>> set(s)
    {'o', 't'}
    @fred1599 : ah merci pour cette solution ! J'avais vu que count était deprecated pour la classe string (bien que toujours présente en Python 3 malgré ce que dit la doc de Python 2 à ce sujet). counter semble être la solution la plus élégante.

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    @Bktero

    J'avais vu que count était deprecated pour la classe string
    Ce n'est pas ce qui me gêne le plus, en fait count est une méthode qui repart du début de la chaîne pour recompter, c'est pas très efficace tout ça...

    Pour obtenir la liste des lettres, cette méthode est aussi simple à mettre en oeuvre (je ne connais pas sa performance en revanche)
    la collection Set est très efficace, c'est un binding C, seulement stratégiquement ça implique de faire set + compteur, peut-être pas ce qui est le plus efficace, on pourrait tester, mais j'ai la flemme

    Bonne journée
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    La réponse brève serait: "Il est fort dommage de ne pas encore connaître les objets de base Python.
    Ils sont fait pour traiter ces cas simples. Mais il faut bien commencer."

    Pour la réponse longue...
    Quand je lis votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for i in phrase :
    	exist = False
    	if lenNoReLe == 0 :
    		noRepeatLettre = str(i)
    	for j in noRepeatLettre :
    		if i == j :
    			exist = True
    			break
    	if exist == False :
    		noRepeatLettre = noRepeatLettre + str(i)
    		lenNoReLe += 1
    je me dis que ca fonctionnerait mieux sans les lignes 3 & 4.

    Apres cote Python, la fonction input retourne un "str" et pas un tableau de bytes.
    Pas la peine de convertir, les appels a str ne servent a rien.
    Je ne vois pas trop non plus l’intérêt d'alourdir ces lignes avec l’incrémentation de lenNoReLe a chaque itération: c'est peut etre plus performant en C mais avec Python, on cherche la lisibilite: ajouter lenNoReLe = len(noRepeatLettre) en sortie de boucle, ca fait deja 3 lignes en moins.
    Une sequence comme "str" permet de se passer du flag exist.
    En gros, ca donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    noRepeatLettre = ""
    #On cré une autre chaîne 
    #il n'y a pas de répétition de charactère
    for c in phrase:
        if c not in noRepeatLettre:
            noRepeatLettre += c
    lenNoReLe = len(noRepeatLettre)
    "set" permettrait une version plus courte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #On cré une autre chaîne 
    #il n'y a pas de répétition de charactère
    noRepeatLettre = set(phrase)
    lenNoReLe = len(noRepeatLettre)
    Pour la partie "affichage des résultats":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        for i in noRepeatLettre :
            nbre = phrase.count(str(i))
        	print(str(i))
        	print(str(nbre))
        	print(" / ")
        	print(str(lenNoReLe))
    Python essaie d’être "polymorphe".
    Pas la peine d'ecrire print(str(nbre), print(nbre) suffit.
    Tous les objets de bases Python peuvent etre passes a print.
    Comme ce sont des objets, print appellera leur méthode __str__.
    Lorsque vous créerez vos objets, vous pourrez aussi leur ajouter une methode __str__ pour que "print" affiche ses attributs.
    Bienvenue dans le monde de la POO.

    Python permet de formatter les chaines avec des formats semblables a C.
    "print" est une fonction qui admet un nombre variable d'arguments.
    On pourrait simplifier ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        for c in noRepeatLettre :
            n = phrase.count(c)
            print(c, n, '/ %d = %.02f' % (lenNoReLe, n / lenNoReLe))
    Je n'ai pas de solution cote mix de TAB et SPACE pour "indenter" proprement un bloc.
    Utiliser SPACE fonctionne très bien avec IDLE.
    La seule solution sera de s'imposer la discipline de ne pas les mélanger (ou de changer d’éditeur).

    De toutes façons, apprendre un nouveau langage c'est (re)penser différemment le codage de ses algos.
    Pour l’écrire en Python, il faudrait arriver a le "repenser" en Python.
    Si vous ne connaissez pas les fonctionnalités de bases de Python, vous ne pourrez que traduire mot a mot le code C.

    Ce n'est pas si mal et c'est un bon exercice.
    Peut être que passer du temps a lire un tuto et apprendre les fonctionnalités de bases du langage vous permettrait de progresser plus vite.
    A vous de voir.

    Je n'ignore pas ce que racontent mes collègues.
    Python étant un langage interprété, c'est lent - surtout lorsqu'on vient de C.
    Un des intérêts des bibliothèques comme "collections" avec sa classe "Counter" sera d'appeler du "C" plutôt que de dérouler du Python.
    Ca ira plus vite et le code sera plus concis.
    Mais chaque chose en son temps.

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

Discussions similaires

  1. Afficher les fichiers qui contiennent des caractères accentués
    Par jejeman dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 02/10/2012, 10h35
  2. [Débutant] Afficher seulement une partie des caractères dans une listwiev
    Par Martipit dans le forum VB.NET
    Réponses: 5
    Dernier message: 01/05/2012, 14h09
  3. Récupérer la fréquence d'apparition des trous
    Par lloyd_r dans le forum Signal
    Réponses: 1
    Dernier message: 22/07/2008, 17h45
  4. Script permettant de créer l'ensemble des indexes d'une base
    Par matacars dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/07/2005, 16h14
  5. Comment extraire des caractères d'une chaine ?
    Par Powa87 dans le forum Langage
    Réponses: 16
    Dernier message: 01/01/2005, 19h00

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