IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème pour afficher sur une ligne la longueur et le nombre de mots de cette longueur (exercice) [Python 3.X]


Sujet :

Python

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 23
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Problème pour afficher sur une ligne la longueur et le nombre de mots de cette longueur (exercice)
    Bonjour à tous et merci d’avance de votre aide. Mon problème c’est que je suis bloquée sur un exercice. Voilà le sujet :

    En étudiant différents types de textes (romans, lois, article de journaux…), on se rend compte que non seulement les mots utilisés ne sont pas les mêmes mais aussi que leurs longueurs sont statistiquement différentes : par exemple, il est beaucoup plus fréquent de trouver de longs mots complexes dans un article de loi que dans un livre pour enfants. Afin d’essayer de déterminer automatiquement à quelle catégorie appartient un livre, on souhaite déterminer le nombre de mots de 1 lettre, 2 lettres, 3 lettres… qu’il contient.

    Contraintes :
    Le texte contient un ensemble de mots, séparés par des espaces, sans aucun signe de ponctuation. Chaque mot contient au plus 100 caractères.

    Entrée :
    La première ligne contient deux entiers : nbLignes et nbMots. Chacune des nbLignes lignes suivantes contient nbMots mots.

    Sortie :
    Pour chaque longueur de mot possible, et uniquement s’il y avait des mots de cette longueur dans le texte, vous devez afficher sur une ligne la longueur et le nombre de mots de cette longueur, séparés par un deux-points (il faut mettre un espace de chaque côté du deux-points).

    Exemple :
    entrée :
    2 7
    Qui vole un oeuf vole un boeuf
    Une abeille vaut mieux que mille mouches

    sortie:
    2 : 2
    3 : 3
    4 : 4
    5 : 3
    7 : 2


    Voilà le sujet. Alors mon problème c’est que mon programme marche seulement si :
    - l’utilisateur ne rentre qu’une seule ligne
    - et tous les mots sont différents. (si il y a deux fois "et" par exemple, ça ne marche pas bien.)



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    nbLignes, nbMots = map(int, input().split(" "))
    texte = input()
    liste = []
    motLong = ""
    premierMot = ""
    a = 1
    b = 1
    R1 = []
    R2 = []
    S = []
    R3 = []
     
    for mot in texte.split(" ") :
        liste.append(mot)
        liste.sort(key=len)
        if len(mot) > len(motLong) :
            motLong = mot
            longueurMax = len(motLong)+1
     
    for mot in liste :
        if len(premierMot) != len(mot) :
            premierMot = mot
     
        for a in range(longueurMax) :
            if premierMot == mot and len(mot) == a :
                R1.append(a)
                S.append(b)
            elif premierMot != mot and len(mot) == a :
                R2.append(a)
                S.append(b)
    R3 = R1 + R2
     
    for z in range(longueurMax) :
        for y in R1 :
            x = R3.count(z)
            if x != 0 and z == y :
                print(y, " : ", x)


    Voilà ! Je débute donc je me suis certainement compliqué la vie.
    Pour quand il y a deux mêmes mots j’avais pensé utiliser un compteur mais je ne sais pas trop comment m’y prendre. Et pour plus d’une ligne, j’ai voulu utiliser for i in range(nbLignes) : mais je n’arrive pas à afficher ce que je veux. Je pense que c’est parce que j’utilise les mêmes variables donc ça coince au niveau de mes listes.

    Voilà, merci d’avance

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par SarahetMinnie Voir le message
    Alors mon problème c’est que mon programme marche seulement si l’utilisateur ne rentre qu’une seule ligne
    Ben oui, tu fais un seul input. Un seul input donc une seule saisie. Pourtant tu connais à l'avance le nombre de lignes et le nombre de mots de chaque ligne. Pas compliqué de prévoir une saisie en conséquence...

    Citation Envoyé par SarahetMinnie Voir le message
    et tous les mots sont différents. (si il y a deux fois "et" par exemple, ça ne marche pas bien.)
    Mouais. J'ai un peu regardé ton code mais j'ai vite abandonné. J'y comprends que dalle. Pourquoi déjà trier la liste à chaque insertion (si vraiment un tri était nécéssaire moi j'aurais trié une seule fois à la fin). C'est quoi R1, R2, R3 ? Pourquoi remplir R1 ou R2 pour finalement écrire que R3 c'est R1+R2 (autant remplir directement R3 !!!) Pourquoi tu as un cas spécifique "premier mot" et un autre "mot long" ? En quoi le premier mot ou bien un "mot long" est différent des autres ??? C'est quand-même pas compliqué: on veut compter les longueurs des mots donc on balaye les mots et on compte leur longueur !!! On évite ces tortillages à les prendre, les copier ici ou là, les trier, regarder le premier, pas le premier bref on évite l'infinité d'instructions qui ne participent pas directement à atteindre le résultat attendu quoi...

    Citation Envoyé par SarahetMinnie Voir le message
    Je pense que c’est parce que j’utilise les mêmes variables donc ça coince au niveau de mes listes.
    Ah ben c'est sûr que si tu utilises une même variable pour stocker deux informations différentes en même temps ça ne peut pas trop fonctionner.

    Moi déjà je partirais sur une fonction qui se charge du comptage. Comme ça, elle n'a pas à se préoccuper de la saisie. Et tu peux la tester avec des cas spécifiques en dur pour vérifier que ça compte bien.
    Et pour le compteur j'utiliserais un dictionnaire. Comme ça, seules les longueurs trouvées sont stockées. Grosso-modo, ce serait un truc ressemblant à ceci:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cpt={}
    for mot in liste_de_mots:
    	l=len(mot)
    	cpt[l]=cpt.get(l, 0) + 1
    # for
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 23
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Bonjour

    Envoyé par SarahetMinnie
    Alors mon problème c’est que mon programme marche seulement si l’utilisateur ne rentre qu’une seule ligne

    Ben oui, tu fais un seul input. Un seul input donc une seule saisie. Pourtant tu connais à l'avance le nombre de lignes et le nombre de mots de chaque ligne. Pas compliqué de prévoir uen saisie en conséquence...
    Pour ça j'avais pensé faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in range(nbLignes) :
    texte = input()

    Et pour le compteur j'utiliserais un dictionnaire. Comme ça, seules les longueurs trouvées sont stockées.
    Je n'ai jamais utilisé de dictionnaires, on en a jamais vu en cours. Mais je vais quand même essayé.
    On doit s'en servir comment ? C'est un peu comme avec def ou ça n'a rien à voir ?

    J'ai un peu regardé ton code mais j'ai vite abandonné. J'y comprends que dalle. Pourquoi déjà trier la liste à chaque insertion (si vraiment un tri était nécéssaire moi j'aurais trié une seule fois à la fin). C'est quoi R1, R2, R3 ? Pourquoi remplir R1 ou R2 pour finalement écrire que R3 c'est R1+R2 (autant remplir directement R3 !!!) Pourquoi par exemple tu as un cas spécifique "premier mot" et un autre "mot long" ? En quoi le premier mot ou bien un "mot long" est différent des autres ??
    Oui, c'est à cet endroit que j'ai galéré. J'avais pas rempli directement R3 parce que après je me servais de R1
    Je m'en doutais que j'avais fait un peu n'importe quoi...

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Si tu n'as pas vu les dictionnaires, tu peux très bien procéder avec une liste, qui tiendra les compteurs.

    Au départ ta liste contient 100 zéros (puisqu'on te dit dans l'énoncé qu'on ne considere que des mots de 100 lettres max). Tu parcours ton texte en prenant les mots un par un dans l'ordre. Là pour chaque mot tu regardes sa longueur. Appelons la N. Là tu incrémente de 1 le N ieme terme de ta liste.

    Ainsi si tu prends l'exemple de ton énoncé à la fin ta liste vaudra :
    [0,2,3,4,3,2,0,0,0, ...., 0]

    Cette liste te dis donc que tu as
    0 mots de longueur 1
    2 mots de longueur 2
    etc ...
    et pour faire ta sortie suffit de n'afficher que s'il n'y a pas 0 mot

    PS : Attention ! Le premier terme d'une liste correspond à l'indice 0. Il faut penser à décaler.

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 23
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup de la réponse mais je n'arrive pas à trouver ce qu'il faut. Je pense que j'ai loupé une étape.

    Tout ce que j'arrive à obtenir c'est la longueur de chaque mot. Voici le début du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    nbLignes, nbMots = map(int, input().split(" "))
    texte = []
    N = [0] * 100
     
    for i in range(nbLignes) :
        nouvelleLigne = input()
        for mot in nouvelleLigne.split(" ") :
            texte.append(mot)
     
    for mot in texte :
        N = len(mot)
        print(N)

    Je vais y réfléchir encore, je pense que c'est tout bête mais que je n'arrive pas à le voir....

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SarahetMinnie Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    N = [0] * 100
    for mot in texte :
        N = len(mot)
        print(N)

    Je vais y réfléchir encore, je pense que c'est tout bête mais que je n'arrive pas à le voir....
    N c'est ta liste de nombre de mots. Ce ne peut pas être aussi la longueur d'un mot. Ou bien alors ce n'est plus la liste !!!

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    N = [0,] * 100
    for mot in texte :
        l = len(mot)
        N[l-1]+=1        # Ou bien plus directement N[len(mot) - 1]+=1
    # for
    print(N)             # Juste pour vérifier parce qu'au final il ne faudra afficher que les éléments ne valant pas 0 !!!

    Et le dictionnaire si tu ne l'as pas vu tu ne peux pas l'utiliser. Mais pour résumer, une liste c'est un tableau indicé par des entiers qui se suivent (tab[0]=X, tab[1]=Y, etc.) alors qu'un dictionnaire c'est un tableau indexé par des clefs de ton choix (tab["toto"]=X, tab[123]=Y, etc.). Ici ça aurait été pratique (les index étant les longueurs des mots...)

    PS: J'utilise l'indice l-1 suite à la très juste remarque de lg_53 qui a dit qu'il fallait décaler les indices pour être en conformité avec Python (la longueur d'un mot de 3 lettres venant alors incrémenter N[2]). On peut aussi considérer d'un autre point de vue que le décalage n'est pas nécessaire (on néglige alors N[0] qui restera alors à 0 signifiant ainsi qu'il y a zéro mots de zéro lettres ce qui peut aussi être cohérent avec l'exercice) donc à toi de voir. Mais si tu gardes le décalage, il faudra en tenir compte lors de l'affichage (N[x] indiquant le nombre de mots de x+1 lettres)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 23
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    N = [0,] * 100
    for mot in texte :
        l = len(mot)
        N[l-1]+=1        # Ou bien plus directement N[len(mot) - 1]+=1
    # for
    print(N)             # Juste pour vérifier parce qu'au final il ne faudra afficher que les éléments ne valant pas 0 !!!
    Et le dictionnaire si tu ne l'as pas vu tu ne peux pas l'utiliser. Mais pour résumer, une liste c'est un tableau indicé par des entiers qui se suivent (tab[0]=X, tab[1]=Y, etc.) alors qu'un dictionnaire c'est un tableau indexé par des clefs de ton choix (tab["toto"]=X, tab[123]=Y, etc.). Ici ça aurait été pratique (les index étant les longueurs des mots...)
    D'accord, maintenant j'ai compris tout ça ! Et oui je savais qu'il fallait pas afficher N, je voulais juste vérifier.
    Mais par contre il y a quelque chose que je ne comprends pas trop :
    PS: J'utilise l'indice l-1 suite à la très juste remarque de lg_53 qui a dit qu'il fallait décaler les indices pour être en conformité avec Python (la longueur d'un mot de 3 lettres venant alors incrémenter N[2]). On peut aussi considérer d'un autre point de vue que le décalage n'est pas nécessaire (on néglige alors N[0] qui restera alors à 0 signifiant ainsi qu'il y a zéro mots de zéro lettres ce qui peut aussi être cohérent avec l'exercice) donc à toi de voir. Mais si tu gardes le décalage, il faudra en tenir compte lors de l'affichage (N[x] indiquant le nombre de mots de x+1 lettres)...
    Enfin toute la première partie j'ai compris mais c'est la dernière phrase. Je ne comprends pas trop comment il faut que j'affiche. Pour l'instant j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for nombres in N :
        if nombres != 0 :
            print(l, " : ", nombres)
    Donc pour l, ça m'affiche tout le temps 7. Mais ça je sais pourquoi, c'est parce que le programme il a pris la dernière valeur de l comme je suis sortie de la boucle d'avant mais je comprends pas trop comment je dois faire.


    Et j'ai une autre question, pour :
    J'avais vu qu'il fallait faire ça sur internet mais à quoi correspond le '+=' ?

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SarahetMinnie Voir le message
    Enfin toute la première partie j'ai compris mais c'est la dernière phrase. Je ne comprends pas trop comment il faut que j'affiche. Pour l'instant j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for nombres in N :
        if nombres != 0 :
            print(l, " : ", nombres)
    Donc pour l, ça m'affiche tout le temps 7. Mais ça je sais pourquoi, c'est parce que le programme il a pris la dernière valeur de l comme je suis sortie de la boucle d'avant
    Exactement. Tu n'as plus touché à "l" donc il garde sa valeur (ici de 7). C'est le principe d'une variable que de garder sa valeur tant qu'on n'y touche pas. Ensuite, tu l'affiches donc il t'affiche 7.

    Citation Envoyé par SarahetMinnie Voir le message
    mais je comprends pas trop comment je dois faire.
    Tu ne sais pas afficher un tableau et ses indices ??? Faudrait alors que tu revoies ton cours parce qu'à mon avis, ton prof n'aurait jamais oublié ça.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in range(len(N)):
        print(i+1, N[i])

    Et si tu as vu "enumerate"...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (i, x) in enumerate(N, 1):
        print(i, x)

    Et même sans passer par les outils Python, si tu réfléchis un peu au concept de "tableau" (ce que c'est, comment ça fonctionne) tu peux (tu aurais dû) aussi y arriver par des façons plus classiques
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i=0
    while i < len(N):
        print(i+1, N[i])
        i+=1

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i=1
    for x in N:
        print(i, x)
        i+=1

    Citation Envoyé par SarahetMinnie Voir le message
    Et j'ai une autre question, pour :
    J'avais vu qu'il fallait faire ça sur internet mais à quoi correspond le '+=' ?
    Raccourci syntaxique. variable operateur égale valeur équivaut à variable égale variable opérateur valeur. x+=1 équivaut à x=x+1.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 23
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    C'est bon !!!!
    Merci beaucoup. J'ai tout compris !

  10. #10
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Sinon, on peut aussi s'inspirer de l'histogramme pour une image.
    Pas d'aide par mp.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. MVVM - Problème pour Autoscroll sur une ListBox avec du databinding
    Par caramel dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 18/11/2011, 14h29
  2. Réponses: 1
    Dernier message: 06/10/2008, 09h53
  3. Problème pour rediriger sur une autre page html
    Par PatMh77 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 05/05/2008, 07h48
  4. Réponses: 3
    Dernier message: 05/06/2007, 15h09
  5. Réponses: 1
    Dernier message: 16/05/2007, 20h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo