Fréquence d'apparition france ioi

Résolu
Ak_j Messages postés 18 Date d'inscription   Statut Membre Dernière intervention   -  
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
je suis bloqué à un exercice et je pense que je n'ai pas bien compris l'énoncé .
Voici l'énoncé,


Une seule ligne de texte, ne contenant pas de lettres accentuées, mais pouvant contenir des signes de ponctuation ou des chiffres.
Sortie

Pour chacune des lettres de l’alphabet, il faut afficher, sur une ligne, sa fréquence d’apparition dans le texte définie comme le nombre de fois où la lettre est présente, divisé par le nombre total de lettres du texte (et pas le nombre total de caractères).

et un exemple ,

Entrée : Le francais est une langue romane, de la famille des langues indo-europeennes.

Sortie :
0.109375
0.000000
0.015625
0.046875
0.203125
0.031250
0.031250
0.000000
0.046875
0.000000
0.000000
0.093750
0.031250
0.125000
0.046875
0.015625
0.000000
0.046875
0.078125
0.015625
0.062500
0.000000
0.000000
0.000000
0.000000
0.000000

Voici mon programme:

def nombre_total_lettre(texte:str)-> int:
    """
    renvoie le nombre total de lettres du texte 
    
    >>> nombre_total_lettre('francais')
    8
    """
    compteur = 0
    for lettre in texte:
        lettre = lettre.upper()
        if 'A'<= lettre <='Z':
            compteur += 1
    return compteur

def nombre_apparition_lettre(element:str,texte:str)->int:
    """
    renvoie le nombre de fois où la lettre est présente
    
    >>> nombre_apparition_lettre('l','Le francais est une langue')
    2
    """
    
    compter_lettre = texte.count(lettre)

    return compter_lettre

texte = input()
total_lettre = nombre_total_lettre(texte)


for lettre in texte :
    if 'A'<= lettre <='Z':
        apparition_lettre = nombre_apparition_lettre(lettre,texte)
        frequence = apparition_lettre/total_lettre
        print(frequence)
# il m'affiche qu'un seul resultat 0.015625




je vous remercie d'avance .

Cordialement,

Ak_j


Configuration: Windows / Chrome 102.0.0.0

7 réponses

Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Bonjour,

Pour compter le nb d'apparitions d'une lettre donnée, tu peux utiliser la méthode count():

f = texte.count('a')
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Qu'entends-tu, en fait, par:

divisé par le nombre total de lettres du texte (et pas le nombre total de caractères).

C'est ça que tu veux ? (à la louche ...) :
import string

texte = 'Le francais est une langue romane, de la famille des langues indo-europeennes.'
texte = texte.lower()
L, C = [], []

for lettre in texte:
   if(lettre not in string.punctuation and lettre not in string.whitespace and lettre not in L):
        L.append(lettre)
        C.append(texte.count(lettre))

for k in range(len(L)): print(L[k], C[k]/len(L))
0
Ak_j Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
 
Ok, je vais utiliser count , pour moi le nombre total de lettres, ce seraient simplement les lettres de l'alphabet sans compter les ponctuations ou autre par contre tu pourrais m'expliquer ton code à partie de la ligne 5 s'il te plaît je n'ai pas tout compris.
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Bonsoir

ligne 7 : boucle sur chaque caractère du texte
ligne 8 : si le caractère n'est ni un signe de ponctuation, ni un espace et s'il n'est pas déjà dans la liste L :
ligne 9 : on ajoute ce caractère dans L
ligne 10 : on ajoute le nombre d'apparitions de ce caractère dans C

ligne 12 : boucle sur la liste L:
on affiche le caractère et sa quantité divisée par la longueur de L (donc du nb total de lettres, sans les ponctuations puisqu'on les a évitées ligne 8)
0
Utilisateur anonyme
 
Bonjour Phil.

Je pense que ton code est trop optimisé.

Il s'agit d'un exercice France ioi et Ak_j nous présente un code sans listes, ni méthodes de la classe string.
Donc il n'en est pas encore au niveau de ton code.

Je ne sais pas comment marche France ioi, mais si moi j'étais prof, que je donnais cet exercice à Ak_j aujourd'hui et qu'il me fournisse ta réponse, je lui compterais faux. Parce que d'une part, le code nous pourrait pas être de lui et d'autre part le but est qu'il appréhende l'algo de base.
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168 > Utilisateur anonyme
 
Bonjour Whismeril,

Ah ok, c'est à cause de l'emploi du module string

après, pour éviter certains caractères, il suffit de créer une liste, par exemple avec espace, virgule, point, tiret

et de tester si le caractère courant n'y est pas ...
0
Utilisateur anonyme > Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention  
 
Oui bien sûr, mais dans le code présenté, y'a pas de liste, il ne les a peut-être pas encore vues.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
 
Ak_j que tu n'ais pas encore le niveau de Phil n'est pas grave, ça viendra et je ne l'ai pas non plus ;)

En reprenant le code que tu as posté dans ta question.
Pour comprendre ce qui se passe, il faut ajouter des print de debuggoage (que tu enlèveras du code final si tu veux).

total_lettre = nombre_total_lettre(texte)

print("nombre de lettres:", total_lettre)

for lettre in texte :
    print("caractère :'",lettre,"'")
    if 'A'<= lettre <='Z':
        print("ce caractère est une lettre")
        apparition_lettre = nombre_apparition_lettre(lettre,texte)
        print("nombre d'apparitions :", apparition_lettre)
        frequence = apparition_lettre/total_lettre
        print(frequence)



Ensuite, tu analyses ce qui s'affiche et si tu ne comprends pas reviens ici en décrivant ce qui s'affiche et ce que tu en comprends.
0
Ak_j Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
 
Whismeril ne martyrise pas trop Phil_1857, il m'aide plusieurs fois puis j'ai pu trouver et en plus j'ai compris tout seul merci beaucoup :)
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Hello,

Je ne me sens pas martyrisé :-)

Toute remarque est bonne à prendre ....
0
Utilisateur anonyme
 
Bonjour

je n'espère pas l'avoir martyrisé, d'autant que je connais ses qualités indéniables.

Mais parfois, nous avons tous le défaut de proposer une solution qui nous semble évidente mais n'est pas encore connue du demandeur.
Même à titre personnel, je ne compte plus le nombre de fois où face à un exercice de Maths de mes enfants, ma première question était "tu connais la règle de 3? Non toujours pas... Bon va falloir réfléchir autrement"....
Parce que c'est là tout le sujet, quand on maitrise l'outil qui fait le truc facilement, on en oublie presque d'où vient cet outil et comment faire sans.

Ton programme était quasiment bon, la seule erreur était de ne sélectionner que des majuscules, donc seul le "L" était pris en compte.
C'est pourquoi, il m'a semblé plus instructif pour toi de voir afficher ce qui se passe.
D'abord tu as pu mener ta propre réflexion et on retient mieux ce que l'on a compris par soi même et d'autre part de voir qu'en informatique un "a" n'est pas un "A".

PS Imagine le fou rire le jour où mon ainé est rentré à la maison en me disant "ça y est j'ai appris la règle de 3, ça va être plus facile pour toi de m'expliquer les exercices que je ne comprends pas"
0