Python : Demande d'avis pour coup de gueule ! - Python - Programmation
Marsh Posté le 12-06-2015 à 18:34:32
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
Après si toute ta classe est notée pareil, tu n'as pas à t'en faire autrement bah...
Marsh Posté le 13-06-2015 à 13:22:05
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...
Marsh Posté le 15-06-2015 à 02:58:43
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?
Marsh Posté le 15-06-2015 à 11:38:58
Yo les gens et merci de vos reponses
@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 . Faut dire qu'a la base, on est pas une filière scientifique non plus... 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.
Marsh Posté le 12-06-2015 à 18:29:38
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
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 :
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 :
# 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