Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
781 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Python : Demande d'avis pour coup de gueule !

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Python : Demande d'avis pour coup de gueule !

n°2260231
dunalovitc​h
Posté le 12-06-2015 à 18:29:38  profilanswer
 

Bonjour a tous et désolé de débouler de la sorte, mais j'aurais vraiment besoin de l'avis de personnes calées en python.  
 
Je suis étudiant dans une filière qui n'a pas grand chose a voir avec la programmation mais on a quand même des cours de python de niveau très basique. (bref...)
 
J’étais l'année dernière habitué à un 19,75/20 de moyenne dans cette matière. Cette année, je n'ai pas eu plus de difficultés et je me suis retrouvé avec un 12/20.  
Je viens de voir ma note et je ne la comprend pas du tout. C'est pourquoi j'aimerais que quelqu'un me donne son avis sur le sujet et  
me dise ce qui pourrait justifier cette note (la présentation, la méthode...).  
D'autant plus que j'ai même fait entièrement le sujet d'un pote qui n'y comprend absolument rien, et il a eu 13... Au premier semestre, on avait un autre prof qui a mit 13 a toute la classe.  
En gros, je cherche a savoir si j'ai potentiellement 6 ou 7 points a gratter en allant gueuler un bon gros coup a la fac  :fou:  
 
Que les choses soient claires, rassurez-vous, je ne vous demande pas d'y passer des plombes, mais juste regarder grosso modo si il y a un truc qui vous choque et ou vous  
pourriez enlever des points.  
Le code marche très bien sous Python 3.4.2, aucun bug, rien.  
 
 
Le (petit) sujet :  
 

Spoiler :


Pour la correction orthographique, on utilise une notion de distance un peu différente de la notion précédente appelée distance d'édition. Pour rendre compte des divers types de fautes possibles, on considère comme distance le nombre de modifications (remplacer une lettre par une lettre, supprimer une lettre, ajouter une lettre, échanger deux lettres) nécessaires pour passer d'un mot à un autre. Par exemple, la distance entre fote et faute est de 2, celle entre fuate et faute est de 1.
a) Écrivez des fonctions Remplace1(mot), Supprime1(mot), Ajoute1(mot) et Echange1(mot) qui retournent l'ensemble des mots obtenus à partir du mot mot en effectuant une seule modification.
b) Écrivez une fonction Edit1(mot,dico) qui retourne la liste de tous les mots du dictionnaire dico à distance d'édition 1 du mot mot.
c) Écrivez une fonction Edit2(mot,dico) qui retourne la liste de tous les mots du dictionnaire dico à distance d'édition 2 du mot mot.
d) Créer un dictionnaire contenant des mots et leur fréquence d'apparition dans la langue française  
f) Écrivez une fonction Corriger(mot, dico) qui énumère la liste de tous les mots du dictionnaire dico à distance d'édition 1 ou 2 du mot mot, propose à l'utilisateur de choisir l'orthographe correcte et renvoie le mot choisi.


 
Mes réponses :  
 

Spoiler :


 
#                               QUESTION A)
 
 
#Definition de dico et de mot
print("CORRECTION ORTHOGRAPHIQUE D'UN MOT ERRONE" )
print("" )
print("CONTENU DU DICTIONNAIRE" )
print("" )
dico=["bonjour", "chaussette", "licorne", "ananas", "hipopotame", "gateau", "bonbon",
      "sandwich", "le", "la", "les", "cochon", "poulet", "foret", "pyramide", "bonsoir",
      "merci", "aimer", "manger", "boire", "avec", "contre", "pour", "mais", "voiture",
      "test", "banane", "pomme", "appelle", "maxence", "python", "dictionnaire", "schtroumpf",
      "babar", "compote", "faire", "chien", "chat", "ane", "gentil", "main", "pied", "france",
      "chanson", "chanter", "didgeridoo", "champignon", "fusee", "guitare", "ville", "pays",
      "cheminée", "crabe", "plage", "bateau", "cocotier", "coco", "mouette", "miette", "elle",
      "lui", "moi", "toi", "toit", "noir", "jaune", "rose", "vert", "violet", "orange", "gris",
      "poulette", "tete", "jambes", "bras", "rats", "manier", "europe"]
 
print(dico)
print("" )
 
mot=input("Rentrez un mot: " )
print("" )
 
### DEFINITION DE ECHANGE(MOT)
 
def echange01(mot, p1, p2):
    copie=""
    x=0
    l=len(mot)
    while x < l:
        if x == p1:
            copie=copie+mot[p2]
        elif x == p2:
            copie=copie+mot[p1]
        else:
            copie=copie+mot[x]
        x=x+1
    return copie
 
def echange1(mot):
    l=len(mot)
    liste=[]
    p1=0
    p2=p1+1
    while p2 < l:
        combinaison=echange01(mot, p1, p2)
        liste.append(combinaison)
        p1=p1+1
        p2=p1+1
    return liste
 
print("RESULTAT DE LA FONCTION ECHANGE1" )
print("" )
print(echange1(mot))
print("" )
 
### DEFINITION DE SUPPRIMER1(MOT)
 
def supprimer1(mot):
    l=len(mot)
    x=0
    pos=0
    copie=""
    liste=[]
    while pos < l:
        while x < l:
            if x == pos :
                copie=copie+""
            else :
                copie=copie+mot[x]
            x=x+1
        liste.append(copie)
        copie=""
        x=0
        pos=pos+1
    return liste
 
print("RESULTAT DE LA FONCTION SUPPRIMER1" )
print("" )
print(supprimer1(mot))
print("" )
 
### DEFINITION DE AJOUTE1(MOT)
 
def ajouter01(mot, lettre, pos):
    copie=""
    x=0
    l=len(mot)
    while x < l :
        if x == pos :
            copie=copie+lettre+mot[x]
        elif pos == l :
            copie=mot+lettre
        else :
            copie=copie+mot[x]
        x=x+1
    return copie
 
def ajouter1(mot):
    l=len(mot)
    alphabet=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
    liste=[]
    pos=0
    y=0
    lettre=alphabet[y]
    while pos <= l:
        while y < 26:
            lettre=alphabet[y]
            combinaison=ajouter01(mot, lettre, pos)
            if combinaison!=mot:
                liste.append(combinaison)
            y=y+1
        pos=pos+1
        y=0
    return liste
 
print("RESULTAT DE LA FONCTION AJOUTER1" )
print("" )
print(ajouter1(mot))
print("" )
 
 
### DEFINITION DE REMPLACE(MOT)
 
 
def remplacer01(mot, lettre, pos):
    copie=""
    x=0
    l=len(mot)
    while x < l :
        if x == pos :
            copie=copie+lettre
        else :
            copie=copie+mot[x]
        x=x+1
    return copie
 
def remplacer1(mot):
    l=len(mot)
    alphabet=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
    liste=[]
    pos=0
    y=0
    lettre=alphabet[y]
    while pos <= l:
        while y < 26:
            lettre=alphabet[y]
            combinaison=remplacer01(mot, lettre, pos)
            if combinaison!=mot:
                liste.append(combinaison)
            y=y+1
        pos=pos+1
        y=0
    return liste
 
 
print("RESULTAT DE LA FONCTION REMPLACER1" )
print("" )
print(remplacer1(mot))
print("" )
 
 
#'''################################# QUESTION B) ############################'''
 
 
 
#                               definition de edit1
 
def edit1 (mot, dico):
    liste=[]
    for x in remplacer1(mot):
        if x in dico:
            liste.append(x)
    for x in supprimer1(mot):
        if x in dico:
            liste.append(x)
    for x in ajouter1(mot):
        if x in dico:
            liste.append(x)
    for x in echange1(mot):
        if x in dico:
            liste.append(x)
    return liste
 
print("MOTS A DISTANCE D'EDITION 1 DU MOT CHOISI" )
print("" )
print(edit1(mot, dico))
print("" )
 
 
 
#'''################################# QUESTION C) ############################'''
 
#                               DEFINITION DE EDIT2
 
def editbis1 (mot, dico):
    liste=[]
    for x in remplacer1(mot):
            liste.append(x)
    for x in supprimer1(mot):
            liste.append(x)
    for x in ajouter1(mot):
            liste.append(x)
    for x in echange1(mot):
            liste.append(x)
    return liste
 
def edit2 (mot, dico):
    liste=[]
    l0=editbis1(mot, dico)
    l=len(l0)
    x=0
    #La condition "if y not in edit1(mot, dico)" peut être retirée si l'on veut également inclure les mots a distance 1 du mot "mot"
    while x != l :
        for y in supprimer1(l0[x]):
            if y not in liste:
                if y in dico:
                    if y not in edit1(mot, dico):
                        liste.append(y)
                     
        for y in remplacer1(l0[x]):
            if y not in liste:
                if y in dico:
                    if y not in edit1(mot,dico):
                        liste.append(y)
                     
        for y in echange1(l0[x]):
            if y not in liste:
                if y in dico:
                    if y not in edit1(mot,dico):
                        liste.append(y)
                     
        for y in ajouter1(l0[x]):
            if y not in liste:
                if y in dico:
                    if y not in edit1(mot,dico):
                        liste.append(y)
                     
        x=x+1
    if mot in liste:
        liste.remove(mot)
    return liste
 
print("" )
print("MOTS A DISTANCE D'EDITION 2 DU MOT CHOISI" )
print("" )
print(edit2(mot,dico))
print("" )
 
#'''################################# QUESTION D) ############################'''
 
 
import os
def creerDico( dicoBrut ):
    """ Cree un dictionnaire dont les clés sont les mots et  
    les valeurs le type grammatical """
    dico = {}
    if os.access(dicoBrut, os.R_OK):
        fichier = open(dicoBrut,"r" )
        contenu = fichier.readlines()
        fichier.close()
    else:
        print("Le fichier",nomfichier,"n'existe pas" )
     
    for phrase in contenu:  
        if len(phrase.split()) >= 2:
            cle = phrase.split()[0]
            if cle in dico:
                dico[cle] += 1
            else:
                dico[cle] = 1
    return dico
 
print("" )
print ("RESULTAT DE LA FONCTION CREERDICO AVEC UN DICTIONNAIRE IMPORTE FAIT MAISON" )
print("" )
print(creerDico('dico2.txt'))
print("" )
 
#'''################################# QUESTION E) ############################'''
 
#                                QUESTION ANNULEE
 
#'''################################# QUESTION F) ############################'''
 
def Corriger (mot, dico):
    reponse=''
    liste=edit1(mot,dico)+edit2(mot, dico)
    print("Voici les mots a distance 1 du mot " + mot)
    print(edit1(mot,dico))
    print("Voici les mots a distance 2 du mot " + mot)
    print(edit2(mot,dico))
    if len(liste)!=0:
        while reponse not in liste:
            reponse=input("Choisissez la correction adaptée" )
            print("Vous avez choisi le mot " + reponse)
            if reponse not in liste :  
                print("Attention ! le mot " + reponse + " n'est pas dans la liste ! Choisissez-en un autre." )
    else:
        print("GAME OVER : Aucune correction trouvée, recommencez une nouvelle partie" )
    return reponse
 
print("" )
print ("CORRECTION DU MOT ERRONE" )
print("" )
Corriger (mot,dico)
 
#ordonner la liste en fonction des frequences d'apparition : question annulée


 
PS : Je n'ai rien fait de méchant au prof.  
 
Voila vous seriez bien sympa de me renseigner :)

mood
Publicité
Posté le 12-06-2015 à 18:29:38  profilanswer
 

n°2260232
bardiel
Debian powa !
Posté le 12-06-2015 à 18:34:32  profilanswer
 

dunalovitch a écrit :

Au premier semestre, on avait un autre prof qui a mit 13 a toute la classe.


Même pas la peine d'aller plus loin : prof qui note à la tête du client.
Si tu râles, t'auras encore moins [:macvince:5]  
 
Après si toute ta classe est notée pareil, tu n'as pas à t'en faire [:cdtfcdtfcdtfcdtfcdtf:3] autrement bah...


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
n°2260263
grimmys
Posté le 13-06-2015 à 13:22:05  profilanswer
 

Je regarde rapidement rien qui me choque... J'ai simplement remarqué que les boucles while que tu utilises dans la question a) sont peut-être inadaptées ; tu dois faire un nombre déterminé de tours, et donc une boucle " for x in range(l): " me semble plus approprié.
 
Mais voila c'est juste un détail d'un point de vue ergonomie, simplicité, ce n'est même pas censé valoir un demi-point.
 
Du coup je ne vois pas ce qui a pu te faire perdre autant de points...

n°2260325
The_Grim
Posté le 15-06-2015 à 02:58:43  profilanswer
 

Il y a probablement moyen de réduire le code et de le rendre plus efficace notamment avec les fonctions string :  
par exemple ta fonction supprimer1 (et probablement d'autres) peut devenir quelque chose dans ce genre:
 
def supprimer(mot):
    liste=[]
    for index in range(len(mot)):
        retour=mot[ :index]+mot[index+1:]
        liste.append(retour)
    return liste
 
Beaucoup moins de déclarations, une boucle qui saute et c'est trois fois plus rapide que ta fonction.
C'est vrai qu'avoir un 12 pour le taf que t'as produit ça semble injuste mais je pense que tu étais encore loin du 20 :)
 
PS: Juste par curiosité c'était un dm ou un ds?


Message édité par The_Grim le 15-06-2015 à 03:00:56
n°2260339
dunalovitc​h
Posté le 15-06-2015 à 11:38:58  profilanswer
 

Yo les gens et merci de vos reponses :bounce:  
 
@The_Grim : C'etait un DM, et notre unique note au passage. Je n'en doute pas qu'il y a moyen de faire mieux, seulement le truc c'est que quand je dis que les cours sont basiques, c'est que grosso modo tout ce qu'on a vu en deux ans, c'est :  
- Gestion/utilisation des variables
- Les conditions
- Les fonctions
- les boucles for et while
- les dicos et les listes
- Certaines fonctions type maj() int() str() random() str.split(), les opérations de base et quelques autres petits trucs un peu accessoires, utiles ou rigolos.  
 
Et puis voila, en gros c'est tout. Donc les fonctions string, bah je ne connais pas, depuis deux ans on fait du code avec les outils les plus basiques qui soient, histoire de faire des programmes qui permettent de jouer au pendu, par exemple :sol: . Faut dire qu'a la base, on est pas une filière scientifique non plus... :pt1cable:  Du coup, la façon la plus simple que j'ai trouvé avec les outils qu'on a, c'est cette grosse fonction galère et lourde.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Python : Demande d'avis pour coup de gueule !

 

Sujets relatifs
Python et Tkinter/PmwÉvacuation d'une salle
Animation en PythonPython
[Python] Tetris, besoin d'aide pour élimination d'une ligne complèteProblème de sortie d'une boucle while en PYTHON
Créer un classement en python 2.7[présentation projet] JePolitique, site de débats, votre avis?
programmation score de tennis python pygame 
Plus de sujets relatifs à : Python : Demande d'avis pour coup de gueule !


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR