Inscription / Connexion Nouveau Sujet
Niveau terminale
Partager :

Fonction Python - décodage par analyse fréquentielle

Posté par
remyTPN
01-03-21 à 17:56

alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def frequence(texte):
    f=0
    lettre_freq=''
    L=[]
    for lettre in alphabet:
        L=[lettre for i in range(len(texte))if texte[i]==lettre]
        if len(L)>f:
            f=len(L)
            lettre_freq=lettre
    return lettre_freq,f
    return L

Le programme ci-dessus recherche la lettre la plus fréquente dans un texte donné. Modifier ce programme de telle sorte qu'il renvoie les deux lettres les plus fréquentes dans un texte, ainsi que le nombre d'apparitions dans le texte.

Avez-vous une idée ? n'hésitez pas, plusieurs solutions/syntaxes sont sans doute possibles.

Posté par
mathafou Moderateur
re : Fonction Python - décodage par analyse fréquentielle 01-03-21 à 18:11

Bonjour

plusieurs solutions/syntaxes sont sans doute possibles.

déja dans le programme actuel : ce qui est écrit est un choix de la solution la moins compréhensible pour ce qu'il est sensé faire !

Posté par
remyTPN
re : Fonction Python - décodage par analyse fréquentielle 01-03-21 à 21:27

def frequence(texte):
    f1=0
    f2=0
    lettre_freq1=''
    lettre_freq2=''
    L=[]
    for lettre in alphabet:
        L=[lettre for i in range(len(texte))if texte[i]==lettre]
        if len(L)>f1:
            f1=len(L)
            lettre_freq1=lettre
        elif len(L)>f2:
            f2=len(L)
            lettre_freq2=lettre
    return lettre_freq1,f1,lettre_freq2,f2

J'ai testé ça, mais le programme ne fonctionne pas à tous les coups.

Posté par
mathafou Moderateur
re : Fonction Python - décodage par analyse fréquentielle 01-03-21 à 21:45

déja, plutot que ce "bazar" moi j'utiliserais la fonction native de Python :

texte.count(lettre)

pour trouver la fréquence de la lettre lettre dans le texte texte.

Posté par
mathafou Moderateur
re : Fonction Python - décodage par analyse fréquentielle 01-03-21 à 21:58

texte="maitre corbeau sur un arbre perche tenait en son bec un fromage"
alphabet="abcdefghijklmnopqrstuvwxyz"

nb1=0
lettre1 = ''
nb2=0
lettre2 = ''
for lettre in alphabet :
    c=texte.count(lettre)
    if c>nb1 :
        lettre1=lettre
        nb1= c
    elif c>nb2 :
        lettre2=lettre
        nb2=c
nb=len(texte)
print(lettre1,":",nb1,"fois, fréquence =",nb1/nb)
print(lettre2,":",nb2,"fois, fréquence =",nb2/nb)

*** Console de processus distant Réinitialisée ***
e : 9 fois, fréquence = 0.14285714285714285
r : 7 fois, fréquence = 0.1111111111111111
>>>

Posté par
remyTPN
re : Fonction Python - décodage par analyse fréquentielle 01-03-21 à 23:23

D'accord, merci pour l'aide apportée ^^
En effet, les énoncés de livres laissent parfois à désirer, c'est beaucoup plus clair ainsi...

Posté par
remyTPN
re : Fonction Python - décodage par analyse fréquentielle 01-03-21 à 23:52

erratum, cette fonction donne le même résultat que la mienne éditée précédemment, elle ne fonctionne pas à tous les coups, en effet, dans le texte suivant :  NJQT EXTC UXRBUXK RX VXNNLDX R XNQ HTX QT RBYYLJN OJXY SXN VLQGXVLQJHTXN
La fonction renvoie : "X : 12 fois, fréquence = 0.16666666666666666
Q : 5 fois, fréquence = 0.06944444444444445"

Or, si on compte il y'a 7 fois la lettre N, c'est donc plus de fois que la lettre Q pourtant c'est Q qui est renvoyée comme lettre la plus fréquente derrière X.

Posté par
remyTPN
re : Fonction Python - décodage par analyse fréquentielle 02-03-21 à 09:08

C'est bon, je viens de trouver la solution : texte="NJQT EXTC UXRBUXK RX VXNNLDX R XNQ HTX QT RBYYLJN OJXY SXN VLQGXVLQJHTXN"
alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

nb1=0
lettre1 = ''
nb2=0
lettre2 = ''
for lettre in alphabet :
    c=texte.count(lettre)
    if c>nb1 :
        lettre1=lettre
        nb1= c
nb=len(texte)
print(lettre1,":",nb1,"fois, fréquence =",nb1/nb)
for char in lettre1:
  texte=texte.replace(char,'')

for lettre in alphabet :
    c=texte.count(lettre)
    if c>nb2 :
        lettre2=lettre
        nb2= c
print(lettre2,":",nb2,"fois, fréquence =",nb2/nb)

Posté par
mathafou Moderateur
re : Fonction Python - décodage par analyse fréquentielle 02-03-21 à 10:35

certes, mais là on balaye deux fois
l'idéal serait de ne balayer qu'une fois :

texte="NJQT EXTC UXRBUXK RX VXNNLDX R XNQ HTX QT RBYYLJN OJXY SXN VLQGXVLQJHTXN"
alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

nb1=0
lettre1 = ''
nb2=0
lettre2 = ''
for lettre in alphabet :
    c=texte.count(lettre)
    if c>nb1 :
        lettre2=lettre1
        nb2=nb1
        lettre1=lettre
        nb1= c
    elif c>nb2 :
        lettre2=lettre
        nb2=c
nb=len(texte)
print(lettre1,":",nb1,"fois, fréquence =",nb1/nb)
print(lettre2,":",nb2,"fois, fréquence =",nb2/nb)


*** Console de processus distant Réinitialisée ***
x : 12 fois, fréquence = 0.16666666666666666
n : 7 fois, fréquence = 0.09722222222222222

en effet quand on change de "candidat" pour la plus fréquente , l'ancienne plus fréquente doit devenir candidat à la seconde plus fréquente !

et puis :
for char in lettre1:

lettre 1 est un seul caractère !
texte=texte.replace(lettre1,'')
aurait suffit, sans "for"



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1675 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !