Mon message n'a pas été envoyé, seul le code est parti tout seul! Voici mon message:
Bonjour, étant donné un texte, je dois trouver le mot le plus long, et s'il y en a plusieurs, ma fonction doit retourner le dernier. J'ai fait un exemple concret où les deux mots les plus longs sont "corbeau" et "fromage" qui ont 8 lettres. Mais comment indiquer ceci dans le cas général, en utilisant "len(word" ? Et ensuite comment indiquer le dernier, à partir de son index sans doute? Merci pour vos suggestions.
import string
some_string="Maître Corbeau, sur un arbre perché, tenait en son bec un fromage."
# vire la pontuation
some_string = ''.join ((
char for char in some_string
if char not in string.punctuation
))
maxi = 0
wordMax = ''
for word in some_string.split():
if len(word) >= maxi:
wordMax = word
maxi = len(word)
print(wordMax)
string="Maître Corbeau, sur un arbre perché, tenait en son bec un fromage."
tmp = ""
for x in string:
if x.isalpha() or x==" ":
tmp+=x #on ne garde que les lettres et espaces
#on inverse la liste et on cherche le max en fonction de la longueur
print(max(tmp.split(' ')[::-1], key=len))
Bof, ta construction de chaîne ne l'est pas vraiment.
Je proposerais celle-ci, pas tout à fait équivalente, mais qui éviterait de couper un mot composé :
import string
some_string = "Maître Corbeau, sur un arbre perché, tenait en son bec un fromage."
my_list = [word.strip(string.punctuation) for word in some_string.split()]
Ou encore, pour en revenir au comportement initial :
import string
some_string = "Maître Corbeau, sur un arbre perché, tenait en son bec un fromage."
some_string = some_string.translate(str.maketrans({p: '' for p in string.punctuation}))
my_list = some_string.split()
PS: il y a une paire de parenthèses facultatives dans ton exemple, oldProgrammer.
Merci, oldProgrammer, pour cette réponse si rapide et impeccable.
Ah bon ? Parce que tu as compris le code qu'il t'a fourni ?? Tu sais déjà ce que sont les générateurs ? Franchement, je me demande ce que tu cherches. Juste à trouver les réponses aux questions qui te sont posées ou à comprendre comment proposer par toi-même avec les notions que tu as vues une solution.
Et pour me joindre à mes camarades, voici ma fonction.
import string
def longest_word(sentence):
"""
Returns the last longest word found in the sentence.
Punctuation is ignored.
"""
words = [word.strip(string.punctuation) for word in sentence.split()]
longest_word_length = max(len(word) for word in words)
last_longest_word = [word for word in words if len(word)==longest_word_length][-1]
return last_longest_word
if __name__ == '__main__':
some_string = "Maître Corbeau, sur un arbre perché, tenait en son bec un fromage."
print(longest_word(some_string))
Humm... ok, allez ! dis moi ce qui n'est pas pythonesque dans mon code.
Par contre le fait d'ajouter plusieurs fonction sur une seule ligne et qui puis est sur la ligne permettant l'affichage du résultat, je trouve ça juste limite.
print(max(tmp.split(' ')[::-1], key=len))
Voit le 5ème et 7ème commandement du zen de python, tu comprendras ce qui est pythonique ou en tout cas aura un aperçu de la philosophie du langage.
PS: il y a une paire de parenthèses facultatives dans ton exemple, oldProgrammer.
Oui pour le langage, mais pour la compréhension, on voit la création d'un générateur et l'utilisation d'une fonction... C'est bien de le visualiser, malgré qu'on sait qu'un générateur est un itérateur, l'itérateur n'est pas forcément un générateur.
Utiliser une boucle for pour répondre à un problème solvable par max (sans aller jusqu'au code affreux de lewisbm : max(reversed(my_list), key=len)) ;
C'est pas comme si je ne connaissais pas max, peut-être ai-je voulu présenter le côté algorithmique pour un débutant, non? (regarde son topic d'origine)
camelCase dans le nom de certaines variables (pas recommandé en Python, et pas cohérent avec le reste de ton code) ;
Je pensais que c'était des mixedCase que j'utilisais ? Et même si ce n'est pas recommandé, beaucoup pense pas le même avis... Ça se discute et l'underscore personnellement je trouve ça très moche !
indentation douteuse derrière join.
Oui, possible, si on cherche la petite bête, pourtant j'ai essayé de faire en sorte que mes parenthèses soient symétriquement placées, faut croire que tout le monde n'apprécie pas
C'est pas comme si je ne connaissais pas max, peut-être ai-je voulu présenter le côté algorithmique pour un débutant, non? (regarde son topic d'origine)
Si, j'ai bien lu, et je trouve ça bien de poster un code où l'algorithme est clair. Maintenant, tu demandes en quoi ton code n'est pas pythonique, je te réponds.
oldProgrammer a écrit:
Je pensais que c'était des mixedCase que j'utilisais ? Et même si ce n'est pas recommandé, beaucoup pense pas le même avis... Ça se discute et l'underscore personnellement je trouve ça très moche !
mixedCase n'est qu'un synonyme parmi d'autres. On parle de code pythonique, il s'agit donc d'appliquer les recommandations du langage.
oldProgrammer a écrit:
Oui, possible, si on cherche la petite bête, pourtant j'ai essayé de faire en sorte que mes parenthèses soient symétriquement placées, faut croire que tout le monde n'apprécie pas ;)
Ce qui ne nécessitait pas d'espaces entre join et la première parenthèse ouvrante
Bonjour mes chers correspondants, et merci à tous pour vos contributions qui me sont précieuses car chacune d'elles m'apporte quelque chose et sans doute doute apporte quelque chose aux personnes qui lisent ce post. Je les étudie toutes, et je les essaie toutes pour voir ce que cela donne sur l'IDLE. Merci d'avoir pris un peu de votre temps pour me répondre.
Mon script définitif est ci-dessous. (Je n'avais pas vu le problème de la ponctuation, heureusement que vous me l'avez fait remarquer.)
import string
def find_longest_word(some_string):
some_string = ''.join ((
char for char in some_string
if char not in string.punctuation
))
my_list=some_string.split()
maxi = 0
wordMax = ''
for word in my_list:
if len(word) >= maxi:
wordMax = word
maxi = len(word)
return(wordMax)
Oui, c'est bien le code de oldProgrammer qui répondait exactement à la question que j'avais posée: comment faire ressortir parmi les mots dont je connaissais la longueur, le dernier parmi les plus longs?
Quant à la partie de son programme qui traite de la ponctuation, quel mal y a-t-il à prendre ce morceau et l'insérer dans mon script? Quand je serai parvenue à votre niveau d'expérience à tous, je comprendrai peut-être ce qu'il y a derrière les générateurs. Pour l'instant, je vois que ça marche et c'est ce qui m'importe. Je pourrais comparer cela à une machine à laver ou tout autre appareil: si je pousse un bouton pour la faire marcher et qu'elle fonctionne correctement, est-il fondamental de connaître ce qui se passe derrière? Je serai peut-être un jour un bon dépanneur électroménager mais il faut un temps pour tout.
Je pourrais comparer cela à une machine à laver ou tout autre appareil: si je pousse un bouton pour la faire marcher et qu'elle fonctionne correctement, est-il fondamental de connaître ce qui se passe derrière?
Mais pour reprendre ton analogie, tu es actuellement en train de suivre un cours pour comprendre ce qui se passe derrière. La moindre des choses est donc de t'y intéresser, et de ne pas te contenter d'appuyer sur un bouton au pif parce que quelqu'un te l'a conseillé.
Quant à la partie de son programme qui traite de la ponctuation, quel mal y a-t-il à prendre ce morceau et l'insérer dans mon script? Quand je serai parvenue à votre niveau d'expérience à tous, je comprendrai peut-être ce qu'il y a derrière les générateurs. Pour l'instant, je vois que ça marche et c'est ce qui m'importe. Je pourrais comparer cela à une machine à laver ou tout autre appareil: si je pousse un bouton pour la faire marcher et qu'elle fonctionne correctement, est-il fondamental de connaître ce qui se passe derrière? Je serai peut-être un jour un bon dépanneur électroménager mais il faut un temps pour tout.
La meilleure méthode reste de tester ligne par ligne avec l'interpréteur...
entwanne, je crois que j'ai déjà dit dans un autre post que tout le monde est en train de courir pour suivre le rythme du cours, je ne suis pas la seule, certains disent travailler 40 heures par semaine si ce n'est davantage, il est dans mon intention de reprendre le cours depuis le début lorsque celui-ci sera terminé pour le revoir plus à fond, pour l'instant je cours avec les autres pour ne pas me faire larguer.
oldProgrammer, je travaille en général avec pythontutor pour décomposer les opérations les unes après les autres. Ta partie de programme, je l'ai acceptée pour l'instant telle quelle, elle s'éclaircira d'elle-même le moment venu, je ne me fais pas de souci sur ce point.
Travailler 40h pour avaler du code sans forcément comprendre, c'est un peu avalé sa soupe avec de gros morceaux . On est rasasie c'est sur, mais à t on trouve le goût des aliments qui l'a compose ?
La philosophie de la "vie" en général dit qu'il vaut mieux avoir une tête bien faite que bien pleine . Autrement dit il vaut mieux Comprendre ce que l'on fait que d'apprendre bêtement .
Dans ce cas présent je vais être vieux jeux mais il vaut mieux passe du temps sur un exercice que de chercher une solution toute faite ou on a rien compris . Une solution peut être trouve d'ailleurs en posant le problème avec une feuille et un crayon à papier pour élaborer un algorithme avant de pondre un code . C'est pas comme cela qu on apprend la programmation aujourd'hui dans ton école Anpiet ?
Dark-linux, on ne va pas parler vitam aeternam de ce malheureux bout de code
# vire la pontuation
some_string = ''.join ((
char for char in some_string
if char not in string.punctuation
))
que m'a filé oldProgrammer et que je me suis enregistré précieusement pour le retrouver le jour où j'en aurai besoin. Les développeurs qui ont conçu Python ont eu l'idée, pour nous faciliter la vie, de créer des trucs que je trouve magiques tels - par exemple - ce que j'ai cherché partout sans le trouver et que j'ai finalement obtenu en réponse à un de mes posts:
Pourquoi ces développeurs n'ont-ils pas eu l'idée de créer une méthode qu'ils auraient appelée "split.punctuation" et qu'il suffirait d'utiliser pour enlever tous les signes de ponctuation?
Tu as raison Anpiet suis vieux jeux ... juste pour t'aider je persiste il vaux mieux galérer sur un petit bout de code une fois et passer à la suite après , et non pas le contraire .
Pour t'aider j'ai un petit neveu dans une école d'ingénieur ou on lui demande de produire du code . Il s'est senti larguer car ses copains produisent de la quantité de ligne qui fonctionne plus ou moins bien...Avec internet facile , un bout de code par ci un bout de code par la, au final on assemble ......En creusant je lui ai demandé si ses copains comprenaient ce qu'ils faisaient ? La réponse est évidente : pas tout , mais le code est fait juste acceptable pour avoir la moyenne...
Je lu ai conseille de perdre du temps sur des petits bouts de code ou de résolution de petits problèmes. Au début il était à la traine ,....aujourd'hui il va un peu plus vite et comprend ce qu'il fait
@+
http://sinclair.recreatedzxspectrum.com/index.php
Le plus long mot
× 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.
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique