Fréquence d'apparition france ioi

Résolu/Fermé
Ak_j Messages postés 18 Date d'inscription dimanche 24 avril 2022 Statut Membre Dernière intervention 23 juin 2022 - 21 juin 2022 à 02:51
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 23 juin 2022 à 09:56
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 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
21 juin 2022 à 08:40
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 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 21 juin 2022 à 13:26
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 dimanche 24 avril 2022 Statut Membre Dernière intervention 23 juin 2022
21 juin 2022 à 18:38
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 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
21 juin 2022 à 21:29
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
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
22 juin 2022 à 08:22
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 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178 > Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024
22 juin 2022 à 11:08
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
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928 > Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024
22 juin 2022 à 11:30
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
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
22 juin 2022 à 08:37
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 dimanche 24 avril 2022 Statut Membre Dernière intervention 23 juin 2022
23 juin 2022 à 01:01
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 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
23 juin 2022 à 09:56
Hello,

Je ne me sens pas martyrisé :-)

Toute remarque est bonne à prendre ....
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
23 juin 2022 à 07:46
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