Découpage de mots⚓︎
Pour analyser automatiquement les débats entre des orateurs, on vous demande de créer une fonction decoupe_mots
qui renvoie la liste des mots de 4 lettres ou plus dans une chaine de caractères discours
passée en paramètre.
On suppose que la chaine discours
a été renvoyée par une fonction de reconnaissance vocale qui ignore la ponctuation et ne renvoie que des lettres minuscules sans accent ainsi que des espaces. Le discours
se termine aussi par une espace.
On n'utilisera pas la fonction
split
dans cet exercice.
Exemples
>>> discours = "je peux vous dire aujourd hui mes amis qu en depit des difficultes et des frustrations actuelles j ai quand meme fait un reve c est un reve profondement enracine dans le reve americain "
>>> decoupe_mots(discours)
['peux', 'vous', 'dire', 'aujourd', 'amis', 'depit', 'difficultes', 'frustrations', 'actuelles', 'quand', 'meme', 'fait', 'reve', 'reve', 'profondement', 'enracine', 'dans', 'reve', 'americain']
>>> test_2 = "abcd azerty xyz azerty "
>>> decoupe_mots(test_2)
['abcd', 'azerty', 'azerty']
def decoupepy-undmots(discours):bksl-nl ...bksl-nlbksl-nlbksl-nlbksl-nl# testsbksl-nlbksl-nldiscours = "je peux vous dire aujourd hui mes amis qu en depit des difficultes et des frustrations actuelles j ai quand meme fait un reve c est un reve profondement enracine dans le reve americain "bksl-nlbksl-nlassert decoupepy-undmots(discours) == [bksl-nl 'peux', 'vous', 'dire', 'aujourd', 'amis', 'depit',bksl-nl 'difficultes', 'frustrations', 'actuelles', 'quand',bksl-nl 'meme', 'fait', 'reve', 'reve', 'profondement',bksl-nl 'enracine', 'dans', 'reve', 'americain'bksl-nl]bksl-nlbksl-nlbksl-nltestpy-und2 = "abcd azerty xyz azerty "bksl-nlbksl-nlassert decoupepy-undmots(testpy-und2) == ["abcd", "azerty", "azerty"]bksl-nlbksl-nlbksl-nldef decoupepy-undmots(discours):bksl-nl mots = list()bksl-nl mot = ""bksl-nl for caractere in discours:bksl-nl if caractere != " ":bksl-nl mot += caracterebksl-nl else:bksl-nl if len(mot) >= 4:bksl-nl mots.append(mot)bksl-nl mot = ""bksl-nl return motsbksl-nlbksl-nlbksl-nl# testsbksl-nlbksl-nldiscours = "je peux vous dire aujourd hui mes amis qu en depit des difficultes et des frustrations actuelles j ai quand meme fait un reve c est un reve profondement enracine dans le reve americain "bksl-nlbksl-nlassert decoupepy-undmots(discours) == [bksl-nl 'peux', 'vous', 'dire', 'aujourd', 'amis', 'depit',bksl-nl 'difficultes', 'frustrations', 'actuelles', 'quand',bksl-nl 'meme', 'fait', 'reve', 'reve', 'profondement',bksl-nl 'enracine', 'dans', 'reve', 'americain'bksl-nl]bksl-nlbksl-nlbksl-nltestpy-und2 = "abcd azerty xyz azerty "bksl-nlbksl-nlassert decoupepy-undmots(testpy-und2) == ["abcd", "azerty", "azerty"]bksl-nlbksl-nlbksl-nl
A
Version fonctionnelle⚓︎
Dans un style fonctionnel, on utilise split
(mais c'était interdit justement pour cet exercice).
def decoupe_mots(discours):
return [mot for mot in discours.split() if len(mot) >= 4]
Remarque
discours.split(" ")
coupediscours
uniquement aux espaces.discours.split()
coupediscours
aux espaces, sauts de ligne, tabulations.
Version avec join
⚓︎
Ici, la boucle pour construire un mot est courte ; dans le pire des cas on a des mots d'une vingtaine de lettres.
Mais dans d'autres situations, de longues boucles avec ajout de caractères dans une chaine de plus en plus grande, la chaine est recopiée intégralement à chaque tour (c'est un objet immuable). On aimerait éviter la recopie entière du début de la chaine.
Pour cela, on crée une liste vide, dans laquelle on ajoute tous les morceaux à chaque tour de boucle. Il n'y a pas de copie. À la fin, on colle les morceaux avec join
.
def decoupe_mots(discours):
mots = list()
lettres = list()
for caractere in discours:
if caractere != " ":
lettres.append(caractere)
else:
if len(lettres) >= 4:
mots.append("".join(lettres))
lettres = list()
return mots
Cette version est théoriquement meilleure, elle serait très utile dans un autre cadre.
Z