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 sur un exercice sur les dictionnaires et les listes [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Femme Profil pro
    Ingénieur statisticien
    Inscrit en
    Février 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Ingénieur statisticien
    Secteur : Transports

    Informations forums :
    Inscription : Février 2023
    Messages : 8
    Par défaut problème sur un exercice sur les dictionnaires et les listes
    Bonjour,
    j'ai besoin de l'aide sur l'exercice suivant. Mon code ne retourne pas le résultat attendu.

    le voici l'énoncé de l'exercice:
    Écrire une fonction words_by_length(fileName) qui prend en paramètre le nom, sous forme d’une chaîne de caractères, d’un fichier texte, et qui renvoie un dictionnaire associant à une longueur l la liste triée (dans l’ordre utf-8 croissant) des mots de longueur l présents dans le texte contenu dans le fichier. Ces mots seront écrits en minuscules.
    Le voici mon code
    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
    def words_by_length(fileName) :
        dico_inter = {}
        dico_sortie = {}
        with open(fileName, encoding="utf-8") as fichier :
            for ligne in fichier :
                for mot in ligne.split() :
                    mot = mot.lower()
                    if mot not in dico_inter :
                        dico_inter[mot] = len(mot)
        list_len = list(dico_inter.values()) 
        list_len = sorted(list_len)
        list_mot = list(dico_inter.keys()) 
        list_mot = sorted(list_mot)
        for longueur in list_len :
            for mot2 in list_mot :
                if dico_inter[mot2]==longueur :
                    if longueur not in dico_sortie : 
                        dico_sortie[longueur]=[mot2]
                    elif mot2 not in dico_sortie[longueur] :
                        dico_sortie[longueur].append(mot2)
        return dico_sortie

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par YSENE Voir le message
    j'ai besoin de l'aide sur l'exercice suivant. Mon code ne retourne pas le résultat attendu.
    Ben chez-moi ton code a parfaitement retourné le résultat attendu.

    Après ton code reste très hésitant. D'abord tu récupères les longueurs, puis les mots, puis tu les tries... On voit qu'il te manque quelques habitudes. Si ça t'intéresse voici une solution plus dans l'esprit "Python"...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def words_by_length(fileName) :
    	res=dict()
    	with open(fileName, encoding="utf-8") as fichier :
    		for ligne in fichier :
    			for mot in ligne.split():
    				res.setdefault(len(mot), list()).append(mot.lower())
    		# for
    	# with
    	return dict((k, sorted(v)) for (k, v) in res.items())
    # words_by_length()
    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
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Ben chez-moi ton code a parfaitement retourné le résultat attendu.
    Peut être faut-il aussi gérer les ponctuations que peuvent contenir le texte...

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour

    comme le dit Hominidé, il faudrait sans doute remplacer split() par une fonction beaucoup plus élaborée ?

    Sinon existe une grosse différence entre les 2 fonctions:
    YSENE ne duplique pas les mots dans la liste alors que Sve@r le fait (suis pas sûr de la demande dans l'exercice... et si UpyLaB le teste)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # code de Sve@r avec non duplication
    res.setdefault(len(mot), set()).add(mot.lower())

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par papajoker Voir le message
    YSENE ne duplique pas les mots dans la liste alors que Sve@r le fait
    Exact. YSENE utilise le mot comme clef donc avec deux mots identiques un seul sera traité. Et moi je benne en vrac tous les mots trouvés sans me préoccuper d'une redondance.
    Je ne vais pas prétendre que j'y ai pensé et que c'est voulu mais avec le recul, l'énoncé parle simplement de "mots de longueur l présents dans le texte contenu dans le fichier" donc je pense que deux mots identiques étant tous deux présents dans le texte doivent : et être pris en compte ; et être restitués tous les deux à la sortie.

    Et ta correction via un set() pour assurer l'unicité montre que vraiment c'est pas un gros souci
    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]

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonjour,

    Perso, j'utiliserai les regex pour récupérer tous les mots et éviter les ponctuations et les caractères spéciaux.

  7. #7
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Citation Envoyé par fred1599 Voir le message
    Perso, j'utiliserai les regex pour récupérer tous les mots et éviter les ponctuations et les caractères spéciaux.
    Sinon, une simple boucle, sur les ponctuations et caractères spéciaux, sur mot.replace(pattern, "") devrait faire l'affaire...

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Sinon, une simple boucle, sur les ponctuations et caractères spéciaux, sur mot.replace(pattern, "") devrait faire l'affaire...
    C'est bien pour cela que je dis perso, parce-qu'à mon sens, le choix des regex doit amener à rendre plus efficace en évitant une boucle Python et utiliser une boucle CPython.

    Mais si déjà ça fait le café, ça sera déjà très bien !

  9. #9
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par fred1599
    Mais si déjà ça fait le café, ça sera déjà très bien !
    Oui , tout à fait.
    Tu aurais dit "Perso, j'utilise replace()...", je serais probablement intervenu pour ajouter: Sinon, on peut utiliser le module Re ....
    histoire de compléter la roue selon qui tient le volant.

  10. #10
    Membre régulier
    Femme Profil pro
    Ingénieur statisticien
    Inscrit en
    Février 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Ingénieur statisticien
    Secteur : Transports

    Informations forums :
    Inscription : Février 2023
    Messages : 8
    Par défaut
    Merci d'avoir réagi pour me venir en aide.
    je précise que je suis nouvelle dans la programmation en python. pour la fonction regex quelle est la syntaxe. Merci.
    et aussi si je pouvez avoir plus d'information sur l'utilisation de la boucle for

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Hello,

    @Beginner,

    Je me suis laissé fourvoyer par cette histoire de ponctuations, tu as raison, effectivement, dans mon précédent code je n'avais pas créer de suppression spécifiques liées à la ponctuation.

    Pour ceux qui le font, car ils en ont besoin, l'autre solution pourrait être d'utiliser la méthode strip
    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
    import re from collections import defaultdict from string import punctuation word_regex = re.compile(r'\b\w+\b') def get_words(my_file): result = defaultdict(set) with open(my_file) as f: words = word_regex.findall(f.read().lower()) for word in words: result[len(word)].add(word) return {k: sorted(v) for k, v in result.items()}
    À savoir que j'ai utilisé lower alors que selon le PO, le texte est tout en minuscules, et qu'on ne demande pas un tri spécifique...

    EDIT: Retrait du paramètre key=len selon la remarque de Sve@r (voir ci-dessus).

  12. #12
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Hello,

    Bon comme je l'ai dis avec les regex, voici une proposition,

    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
    import re
    from collections import defaultdict
    from string import punctuation
     
    word_regex = re.compile(r'\b\w+\b')
    punctuation_regex = re.compile(f'[{re.escape(punctuation)}]')
     
     
    def get_words(my_file):
        result = defaultdict(set)
        with open(my_file) as f:
            content = punctuation_regex.sub("", "".join(f.read().lower()))
        words = word_regex.findall(content)
        for word in words:
            result[len(word)].add(word)
     
        return {k: sorted(v, key=len) for k, v in result.items()}
    C'est sans doute améliorable...

  13. #13
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,
    Citation Envoyé par fred1599 Voir le message
    C'est sans doute améliorable...
    Ton code semble plus rapide que le code avec replace car avec cette dernière on parcourt le texte pour chaque signe de ponctuation...

    1- Je trouve aussi que d'utiliser findall est meilleur que d'utiliser split, on évite des chaines vides... Et c'est plus polyvalent ---> on cherche d’après les caractères qu'on inclus (comme les lettres de l'alphabet...) et non d’après les caractères qu'on exclus (comme les signes de ponctuation)

    Mais du coup je ne vois pas l’intérêt de "nettoyer" le texte (supprimer toutes les ponctuations) car justement ce n'est pas utile avec findall puisque (encore une fois) on cherche d’après les caractères qu'on inclus et non d’après les caractères qu'on exclus.

    2- D'ailleurs ce nettoyage peut parfois poser problème, exemple : l'école devient lécole

    3- Juste une remarque : au début quand j'ai testé le code il y a avait des choses bizarres, c'était dû au fait qu'il faut préciser l'encodage lors de l'ouverture du fichier...


    D'une manière générale je trouve que chercher d’après les caractères qu'on inclus est plus efficace et plus fiable car on sait ce que l'on veut inclure alors que la liste de ce que l'on doit exclure peut être longue, cela peut être plus que les signes de ponctuation...

    Qu'en pensez-vous ?

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    C'est sans doute améliorable...
    Pettite erreur sur sorted(v, key=len). Il faut trier la liste des mots sur l'ordre alphabétique et non sur leur longueur (surtout que tous les mots de chaque liste ont la même longueur)

    Citation Envoyé par fred1599 Voir le message
    selon le PO, le texte est tout en minuscules
    En fait il a dit "les mots seront écrits en minuscule". Perso je l'ai compris "devront être écrits en minuscule par votre programme".
    Et sur le site Upylab, les fichiers d'exemple contiennent des majuscules.
    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]

  15. #15
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Pettite erreur sur sorted(v, key=len). Il faut trier la liste des mots sur l'ordre alphabétique et non sur leur longueur (surtout que tous les mots de chaque liste ont la même longueur)
    Arf oui, j'ai vraiment été trop vite sur le coup là

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

Discussions similaires

  1. [BOXIR3]Problème sur les listes de valeur
    Par bablight dans le forum Designer
    Réponses: 0
    Dernier message: 01/07/2015, 11h25
  2. Problèmes sur les exercices de Bts
    Par Steve74 dans le forum Débuter
    Réponses: 2
    Dernier message: 01/11/2014, 20h42
  3. Problème sur les listes
    Par scary dans le forum Prolog
    Réponses: 11
    Dernier message: 31/03/2010, 08h17
  4. petit problème sur les listes chaînées
    Par poche dans le forum C
    Réponses: 14
    Dernier message: 19/03/2007, 16h53
  5. Problème sur les listes doublement chainée
    Par Traouspont dans le forum C
    Réponses: 5
    Dernier message: 05/01/2007, 12h02

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