Je bloque sur un exercice Python, j'ai besoin de votre aide.
La consigne est la suivante : Fonction qui à partir de l'adresse d'un fichier contenant des mots retourne un dictionnaire où la clé est le mot et la valeur associée est taille du mot, il ne faut pas compter le caractère '\n'. Compléter les lignes contenant pass.
Entrée : str
Sortie : un dictionnaire
def dicoLongMot(adr):
with open(adr,'r',encoding='utf-8') as f:
listeMot=f.readlines()
dicoRep={}
for m in listeMot:
if m[-1]=="\n":
pass
else:
pass
return dicoRep
def dicoLongMot(adr):
with open(adr,'r',encoding='utf-8') as f:
listeMot=f.readlines()
dicoRep={}
for m in listeMot:
if m[-1]=="\n":
dicoRep[listeMot[len(m)][:-1]]=len(m)
else:
dicoRep[listeMot[len(m)]]=len(m)
return dicoRep
Mais ça ne compte pas correctement et ne retourne pas tous les mots :(
regarde ce que tu vas chercher dans listeMot quand tu créé ton dictionnaire, ça devrait te sauter aux yeux (Rappel: on est dans une boucle qui parcours les mots)
Merci, mais comment puis-je enlever le '\n' à la fin de chaque clés avec ce code ? :
def dicoLongMot(adr):
""" A COMPLETER
Fonction qui à partir de l'adresse d'un fichier contenant des mots retourne un dictionnaire
où la clé est le mot et la valeur associée est taille du mot il ne faut pas compter le caractère '\n'
Entrée : str
Sortie : un dictionnaire
"""
with open(adr,'r',encoding='utf-8') as f:
listeMot=f.readlines()
dicoRep={}
for m in listeMot:
if m[-1]=="\n":
dicoRep[m]=len(m)
else:
dicoRep[m]=len(m)
return dicoRep
J'ai essayé, mais en reprenant mon code précédent et celui-ci, j'obtiens une erreur :/
def dicoLongMot(adr):
with open(adr,'r',encoding='utf-8') as f:
listeMot=f.readlines()
dicoRep={}
for m in listeMot:
if m[-1]=="\n":
dicoRep[[m][:-1]]=len(m)
else:
dicoRep[m]=len(m)
return dicoRep
Je ne veux pas être rabat-joie. N'est-ce pas len(m)-1 au lieu de len(m-1)
PB68 a écrit:
Bonjour.
Petite réflexion perso, ne faudrait-il pas plutôt écrire
if m[-1]=="\n":
dicoRep[m[:-1]] = len(m-1)
else:
dicoRep[m] = len(m)
Bien vu !!! J'aurais mieux fait de me coucher 😩😩😩
Le programme final que j'avais écrit pour l'exercice et testé était :
def dicoLongMot(adr):
with open(adr,'r',encoding='utf-8') as f:
listeMot=f.readlines()
dicoRep={}
for m in listeMot:
if m[-1]=="\n":
dicoRep[(m)[:-1]]=len(m) -1
else:
dicoRep[m]=len(m)
return dicoRep
Le programme final que j'avais écrit pour l'exercice et testé était :
def dicoLongMot(adr):
with open(adr,'r',encoding='utf-8') as f:
listeMot=f.readlines()
dicoRep={}
for m in listeMot:
if m[-1]=="\n":
dicoRep[(m)[:-1]]=len(m) -1
else:
dicoRep[m]=len(m)
return dicoRep
J'ai compris que ce code suivait un canevas proposé dans l'exercice. Toutefois, je ne trouve pas ce canevas forcément très heureux. Il y a deux choses que je trouve gênantes :
on parcourt deux fois la liste des mots : une fois quand on extrait les lignes du fichier et une deuxième fois quand on parcourt la liste
le branchement pour savoir si un \n termine la ligne est probablement très coûteux alors que son placement est prévisible (en théorie, toutes les lignes sauf la dernière)
Pour le premier point, il suffirait de parcourir les lignes du fichier avec une boucle for, sans readlines, c'est d'ailleurs indiqué qqpart dans la doc officielle : Note that it’s already possible to iterate on file objects using for line in file: ... without calling file.readlines().
Pour le deuxième, il semble, d'après mes essais et peut-être d'après ce que dit le tutoriel Python officiel ICI, qu'en fait, même la dernière ligne est systématiquement suivie d'un \n dans le retour de la lecture par itération (ce que j'ignorais avant cet essai).
Enfin, puisqu'on cherche à supprimer un saut de ligne qui suit un mot, il me semble plus adapté d'utiliser rstrip. Au total j'obtiens le code suivant :
def dicoLongMot(adr):
with open(adr,'r',encoding='utf-8') as f:
return {m.rstrip():len(m)-1 for m in f}
print(*dicoLongMot("mots.txt").items(), sep='\n')
with open(name, encoding="utf-8") as file:
return {w: len(w) for w in map(str.rstrip, file) if w}
Taille des mots d'un dictionnaire
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Blond, bouclé, toujours le sourire aux lèvres...
Blond, bouclé, toujours le sourire aux lèvres...
PB68
Le Tout est souvent plus grand que la somme de ses parties.
PB68
Découverte Python Doc Tkinter Les chaînes de caractères