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 :

Exercice dictionnaire python [Python 3.X]


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Janvier 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert sécurité informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2020
    Messages : 16
    Points : 18
    Points
    18
    Par défaut Exercice dictionnaire python
    Bonjour j'ai besoin d'aide pour cette exercice je n'y arrive vraiment pas je ne sais pas par où commencer merci de votre aide
    Nom : bg.PNG
Affichages : 1121
Taille : 38,0 Ko

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    La difficulté pour le programmeur Python est de savoir comment passer de "BBB" à sa forme canonique "AAA".

    Soit f la fonction (inconnue) qui permet de passer d'une chaîne de caractères à sa forme canonique.
    Fabriquer un dictionnaire où les clefs sont f(x) et les valeurs la liste des x correspondants est assez trivial:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    D = dict()
    for x in ...:
         key = f(x)
         if key not in D:
               D[key] = []
         D[key].append(x)
    et est tellement "commun" qu'on pourra réduire le nombre de lignes avec un defaultdict ou simplement avec .setdefault

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Janvier 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert sécurité informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2020
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    bonjour merci mais du coup il faut faire comme cela et je suis censé mettre quoi à la place des pointillés s'il vous plaît:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def equiv_canonique():
        D = dict()
        for x in ...:
            key = f(x)
        if key not in D:
            D[key] = []
        D[key].append(x)

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par adamdu30 Voir le message
    je suis censer mettre quoi à la place des pointillés s'il vous plaît
    La liste des x... c'est la liste de mots reçue en paramètre.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre à l'essai
    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Janvier 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert sécurité informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2020
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    Ça ne fonctionne toujours pas ça me met erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def equiv_canonique():
        D = dict()
        for x in d:
            key = f(x)
        if key not in D:
            D[key] = []
        D[key].append(x)
    print(equivalence_canonique('BBB', ’CCC’, ’BABA’, ’ABBA’))

  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 685
    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 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par adamdu30 Voir le message
    sa fonctionne toujours pas sa me met erreur
    Et tu te dis "expert sécurité" ? Remarque t'as raison, le titre d'expert n'est pas protégé en France. C'est à dire que n'importe qui peut se proclamer "expert" en quoi que ce soit sans avoir à fournir de quelconque certificat ou titre officiel. T'as même le droit de te proclamer "expert en orthographe" !!!

    Donc ça ne fonctionne toujours pas ça te met erreur. Surtout ne nous dit pas quelle erreur ça te met, ça serait trop facile (oui, tant qu'à nous demander de l'aide, autant nous la challenger un peu). A mon avis, ça te met "erreur" lorsque tu appelles f(x). As-tu lu attentivement la phrase de wiztricks quand il écrit "Soit f la fonction (inconnue) qui permet de passer d'une chaîne de caractères à sa forme canonique." ??? Quel est le mot de cette phrase que tu ne comprends pas ? "inconnue" ??? ça signifie que cette fonction n'existe pas et que tu dois alors l'écrire
    Accessoirement, si ta fonction est censée recevoir une liste de mots en paramètres, ce serait bien aussi de la définir dans ce sens. Remarque c'est peut-être là aussi l'erreur (quand tu écris for x in d: alors que "d" n'existe pas)

    Et quand tu postes un code,
    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
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par adamdu30 Voir le message
    sa fonctionne toujours pas sa me met erreur
    Le code que vous avez posté contient tellement d'erreurs de syntaxe et de bourdes qu'on dirait que c'est la première fois que vous codez avec Python. Si c'est le cas, ouvrez un tuto. et apprenez les bases...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre à l'essai
    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Janvier 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert sécurité informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2020
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    Nom : Capture.PNG
Affichages : 896
Taille : 42,9 KoNom : Capture1.PNG
Affichages : 831
Taille : 21,4 Ko

    bonsoir mon professeur vient de modifier l'exercice il n'y a pas grande différence je pense ?

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par adamdu30 Voir le message
    mon professeur vient de modifier l'exercice il n'y a pas grande différence je pense ?
    C'est écrit en français, non? Est-ce que vous êtes dans un forum d'explication de texte?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre à l'essai
    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Janvier 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert sécurité informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2020
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    je n'arrive toujours pas à comprendre ce que je doit mettre à la place de f(x)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def equiv_canonique(*donnee):
        D = dict()
        for x in D:
            key = f(x)
        if key not in D:
            D[key] = []
        D[key].append(x)
     
    equiv_canonique(’BBB’, ’CCC’, ’BABA’, ’ABBA’)

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par adamdu30 Voir le message
    [INDENT]je n'arrive toujours pas à comprendre ce que je doit mettre à la place de f(x)
    Explique avec des phrases comment, à partir de "BABA", tu obtiens "AZAZ" comme forme canonique ? Ou (inversement) comment à partir de "AZAZ" tu sais que "BABA" appartient à son groupe ?
    Une fois que tu auras réussi à l'expliquer avec des mots et ordres simples, ne restera qu'à convertir ces mots et ordres en instructions Python.
    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]

  12. #12
    olivier50
    Invité(e)
    Par défaut
    Bonjour je ne comprends rien à l'énoncé qui t'a été donné:

    pourquoi pas en réponse: {'AAA':['BBB','CCC'],'AZAZ':['BABA','ABAB']} à l'exemple donné vu que la clé DCCD peut renvoyer aussi à 'ABBA'.

    En l'état difficile de proposer un algorithme vu le gros flou de la notion de canonicité dans l'énoncé; il n'y a pas de définition, juste un exemple et qui n'est pas clair du tout.

    A+
    Dernière modification par olivier50 ; 03/02/2020 à 19h41.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Janvier 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert sécurité informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2020
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    mon prof m'a dit d'utiliser translate ()
    https://www.journaldev.com/23697/pyt...ring-translate

  14. #14
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    avec translate() ça peut se faire mais ça me semble peu adapté

    d'autant qu'il y a une petite vilénie dans l'exercice, 'ABBA' peut assez facilement donner 'CDDC' mais pas 'DCCD', ça oblige à bidouiller la translation dont on perd alors la logique, à ce stade une forêt de if adéquate ferait aussi bien le job à mon avis...

    avec quelques regexp bien senties en revanche ça passe comme dans du beurre

  15. #15
    olivier50
    Invité(e)
    Par défaut
    1. Je verrais la liste transformée en dataframe.
    2. Je construis une fonction qui pour chaque chaîne renvoie la clé.
    3. J'applique la méthode apply sur le dataframe avec la fonction en paramètre afin d'obtenir une seconde colonne au dataframe qui donne la clé pour chaque chaîne en colonne 1.
    4. Je boucle sur le dataframe et pour chaque valeur clé je fais un append pour ajouter les valeurs de chaine et obtenir le dictionnaire.

    Pour la fonction j'analyse la chaine, je prends la plus petite lettre dans l'ordre alphabétique et lui affecte la valeur 00 puis chaque autre lettre l'écart. J'ai une correspondance de tableau de 00 à 25 qui affecte la lettre donc translate peut servir ici. 'TOTO' prend la valeur clé BABA.

    A+

  16. #16
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Cet énoncé est délirant ou incomplet : on tourne en rond car personne n'est capable de dire comment construire une clé dynamiquement (le machin canonique), puis comment tester quels mots respectent cette clé.
    Le plus croustillant étant de voir ce que cet exercice est apparemment donné à de parfaits débutants en Python
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  17. #17
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    Hello, j'imagine ça mais ???

    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
    canon = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    eq_canon = {}
     
    def equiv_canonique(mot) :
        indice = 0
        dico = {}
        forme = ''
        res = ''
        for l in mot : 
            if l not in dico : 
                dico[l] = indice
                forme += str(indice)
                indice += 1
            else :
                forme += str(dico[l])
     
        for i in forme :
            res += canon[int(i)]
     
        if res not in  eq_canon :
            eq_canon[res] = [mot]
        else :
            eq_canon[res].append(mot)
     
    equiv_canonique('toto')
    equiv_canonique('tata')
    equiv_canonique('tordu')
     
    print(eq_canon)
    ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {'ABAB': ['toto', 'tata'], 'ABCDE': ['tordu']}
    A adapter pour une liste de mot bien évidement.

  18. #18
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    En repartant de ta solution, je propose la solution suivante :
    Code python : 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
    #fonction de calcul de la clé canonique
    def computeKey(mot):
     
        canon = iter("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
        assoc, canonical_key = dict(), ""
     
        for l in mot:
            if not l in assoc:
                assoc[l]= next(canon)
     
            canonical_key += assoc[l]
     
        return canonical_key
     
     
    #fonction des équivalences canoniques
    def equiv_canonique(*word_list):
     
        dico = dict()
     
        for w in word_list:
            k = computeKey(w)
            dico[k] = dico.get(k, []) + [w]
     
        return dico
     
    # tests
    print(equiv_canonique("toto", "tata", "tordu"))
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  19. #19
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    en voyant les solutions proposées et après relecture de l'énoncé je comprends un peu mieux la logique de l'exercice et l'intérêt de translate() finalement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def equiv_canonique(*donnee):
        dst = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        dico = dict()
        for mot in donnee:
            idx = (dst*2).index(mot[0])
            src = (dst*2)[idx:idx+26]
            tab = str.maketrans(src, dst)
            cle = mot.translate(tab)
            dico[cle] = dico.get(cle, []) + [mot]
        return dico
    donc finalement la forme canonique est indexée sur le premier caractère du mot qu'on traite comme devant devenir un 'A', ce qui pour 'BABA' permet de donner 'AZAZ'

  20. #20
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Okay, je viens (enfin) de comprendre le principe de cette clé. Ton code est le plus efficient
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Python 3.X] récupérer la valeur maximum dans un dictionnaire python
    Par khaled87 dans le forum Général Python
    Réponses: 6
    Dernier message: 11/01/2015, 19h43
  2. Exercice en python besoin de votre aide
    Par Takahitekun dans le forum Général Python
    Réponses: 6
    Dernier message: 14/01/2013, 16h10
  3. Conversion d'un dictionnaire Python en Tcl
    Par t_om84 dans le forum Tcl/Tk
    Réponses: 1
    Dernier message: 23/09/2009, 18h30

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