Partage
  • Partager sur Facebook
  • Partager sur Twitter

Quel est l'intérêt du dictionnaire Python ?

    25 juillet 2021 à 0:14:11

    Bonjour à tous.

    Tout est dans le titre...

    A quoi sert un dictionnaire Python ? Peut-on s'en passer ? Gagne-t-on à utiliser ce procédé ? Est-ce que ça accélère la recherche ?

    J'ai consulté des "tonnes" (non, j'exagère...) de documents dans Internet sur la question, sans parvenir à y cerner une quelconque utilité : je connais le procédé, j'ai même fait un dictionnaire sur un album de Supertramp ^^ :

    {"Supertramp – Crime Of The Century (1974) " : ["01 School", "02 Bloody Well Right", "03 Hide in Your Shell", "04 Asylum", "05 Dreamer", "06 Rudy", "07 If Everyone Was Listening", "08 Crime of the Century"]}

    Et après, qu'est-ce que j'en fais ? Comment me servir de cela ?

    Est-ce que l'un d'entre vous aurait un lien sur un site suffisamment explicite ?

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      25 juillet 2021 à 4:39:46

      Si tu poses la question pour un dico, tu la poseras forcément pour les autres collections (liste, tuple, ...)

      Tu dois tester et voir ce qui correspond le mieux. Par exemple, dans ton dico, je mettrais les titres des albums dans un tuple parce que les titres ne changeront jamais et un tuple est une collection immuable contrairement à la liste.

      Tu commences par le basique (une variable simple) :

      album1 = "Supertramp - Crime Of The Century"
      
      titre1 = "School"
      titre2 = "Bloody Well Right"
      
      ### bref c'est chiant

      alors une liste ? Pas mal pour les titres, mais pour le nom de l'album on garde une variable simple.

      Bon, un dico ? Ah, c'est pas mal, la clé sera l'album et sa valeur une liste (non, un tuple c'est mieux). Ainsi, tu peux mettre tous les albums de Supertramp.

      Selon moi, il ne faut pas s'obstiner à optimiser au maximum, il faut maîtriser son code. Si on te dit d'utiliser tel type de variable mais que tu ne comprends pas, ce sera plus difficile pour déboguer.

      • Partager sur Facebook
      • Partager sur Twitter
        25 juillet 2021 à 10:21:16

        Ca peut être utile par exemple pour traiter des données d'une certaine manière, je reprends un truc que j'ai posté sur un autre forum :
        En entrée on a ça :
        >NW_020169394.1_41 [10497-10619]|KE647364.1_346 [38084-37959]
        MDQLSRKLNLTYLKVGILTSQNEFVTKHLLIIKGLKIFTET
         
        >NW_020169394.1_41 [10497-10619]|KE646921.1_20 [383-240]
        MDQLSRKLNLTYLKVGILTSQNEFVTKHLLIIKGLKIFTET
         
        >NW_020169394.1_41 [10497-10619]|KE647277.1_227 [70875-70720]
        MDQLSRKLNLTYLKVGILTSQNEFVTKHLLIIKGLKIFTET
         
        >KE647068.1_7 [1546-1641]|KB908960.1_74 [31221-31316]
        MFYTALFLNVIIYYNLYKDFLSHLFSKIYYKE
         
        >KE647068.1_7 [1546-1641]|KB909349.1_29 [13746-13651]
        MFYTALFLNVIIYYNLYKDFLSHLFSKIYYKE
        On veut récupérer ça :
        >NW_020169394.1_41 [10497-10619]|KE647364.1_346 [38084-37959] | KE646921.1_20 [383-240] | KE647277.1_227 [70875-70720] 
        MDQLSRKLNLTYLKVGILTSQNEFVTKHLLIIKGLKIFTET    
         
        >KE647068.1_7 [1546-1641] |KB908960.1_74 [31221-31316] | KB909349.1_29 [13746-13651]
        MFYTALFLNVIIYYNLYKDFLSHLFSKIYYKE
        Du coup j'ai codé ça :
        #Je découpe chaque paragraphe en 3 : 
        #[['>NW_020169394.1_41 [10497-10619]'  ,  'KE647364.1_346 [38084-37959]' , 'MDQLSRKLNLTYLKVGILTSQNEFVTKHLLIIKGLKIFTET'] , ... ]
        lines = [[x.split('|')[0], x.split('|')[1].split('\n')[0], x.split('\n')[1]] for x in code.split('\n \n')]
         
        #Je créé un dictionnaire avec comme clé le premier élément (ex : '>NW_020169394.1_41 [10497-10619]')
        # des sous-listes que je viens de créer plus haut, à laquelle j'attribue une liste composé des deux autres 
        # éléments de la sous-liste (ex : ['|KE647364.1_346 [38084-37959]' , '|MDQLSRKLNLTYLKVGILTSQNEFVTKHLLIIKGLKIFTET'])
        dico = {}
        for x,y,z in lines:
        	try:
        		dico[x][0]+=" |"+y #Ici je rajoute juste le second élément (ex : '|KE646921.1_20 [383-240]')
        	except:
        		dico[x]=["|"+y,z]
         
        for x in dico:
        	print(x, dico[x][0],'\n',dico[x][1])
        • Partager sur Facebook
        • Partager sur Twitter

        https://www.youtube.com/watch?v=Dv6Th7kJ64Q

          25 juillet 2021 à 11:36:42

          chrisblues59 a écrit:

          A quoi sert un dictionnaire Python ? Peut-on s'en passer ? Gagne-t-on à utiliser ce procédé ? Est-ce que ça accélère la recherche ?

          Un dictionnaire c'est créer une structure où tu peux indexer des objets et y accéder rapidement. On peut comparer cela aux bases de données, où la différence est la persistance des données.

          On peut s'en passer, le langage C n'a pas ce type de structure.

          On gagne à utiliser ce procédé, oui ! Mais en mettre partout n'est pas une solution, il faut réfléchir à comment concevoir sa solution. Un des exemples qui me vient à l'esprit, est un système de cache qui permet d'aller rechercher l'historique de certaines valeurs de manière optimisée. Voir du côté d'un problème comme Fibonacci par exemple.

          Ça accélère la recherche à tel point que c'est quasi instantanée, encore faut-il avoir à rechercher, à créer correctement sa structure...

          Le dictionnaire comme toutes autres structures en python lors de sa création se justifie, on ne l'utilise pas à toutes les sauces, ce n'est donc pas un problème à tout.

          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

            25 juillet 2021 à 12:14:48

            @fred1599,

            Un problème à tout ou une solution à tout ?? :D:p

            • Partager sur Facebook
            • Partager sur Twitter
              25 juillet 2021 à 12:27:05

              chrisblues59 a écrit:

              A quoi sert un dictionnaire Python ? Peut-on s'en passer ? Gagne-t-on à utiliser ce procédé ? Est-ce que ça accélère la recherche ?

              J'ai consulté des "tonnes" (non, j'exagère...) de documents dans Internet sur la question, sans parvenir à y cerner une quelconque utilité : je connais le procédé, j'ai même fait un dictionnaire sur un album de Supertramp ^^ :

              {"Supertramp – Crime Of The Century (1974) " : ["01 School", "02 Bloody Well Right", "03 Hide in Your Shell", "04 Asylum", "05 Dreamer", "06 Rudy", "07 If Everyone Was Listening", "08 Crime of the Century"]}

              Et après, qu'est-ce que j'en fais ? Comment me servir de cela ?


              Tu as créé un dictionnaire d'UN SEUL album donc l'intérêt est limité. Imagine plutôt un groupe de 1000 personnes dont on connait le pseudo, leur age, le mail et le numéro de téléphone. On crée alors un dictionnaire D reliant le nom (pseudo) de chaque personne à ses infos personnelles (une liste ici de trois éléments). L'intérêt c'est que :

              • tu peux connaître les données de la personne par une seule recherche D[chris]
              • tu peux savoir si telle ou telle personne est enregistrée
              • tu peux supprimer des personnes
              • tu peux rajouter des personnes
              • tu peux modifier des données
              autant de choses que tu feras de manière totalement inefficace avec une liste. Donc, pour faire simple, un dictionnaire c'est une liste indexée par des objets qui ne sont pas des entiers consécutifs à partir de 0.

              C'est une structure de données fondamentales, c'est implémenté le plus souvent par une table de hachage. Le langage C n'a pas en effet (pas en standard du moins, car il y en a de très efficaces, comme khash ou STC) et cela a conduit les gens à se tourner vers le C++.

              Les exemples d'usage de dictionnaires sont innombrables. Imagine que tu veuilles écrire un programme qui convertisse la date du jour, par exemple 25 juillet 2021 en 25/07/2021. Tu auras certainement besoin d'un dictionnaire. Pour convertir dans l'autre sens une liste suffit.

              • Partager sur Facebook
              • Partager sur Twitter
                25 juillet 2021 à 12:31:59

                chrisblues59 a écrit:

                Et après, qu'est-ce que j'en fais ? Comment me servir de cela ?

                L'information qu'on a est l'album sorti par le groupe Supertramp en 1974 nommé "Crime Of The Century" et la liste des titres des chansons qu'il contient.

                Pourquoi avez vous choisi de la représenter par un dictionnaire contenant une seule clef "Supertramp – Crime Of The Century (1974)" associée à la liste des titres? Qu'est ce que vous cherchez à faire? Et est-ce qu'un dictionnaire va aider? Voilà des questions qui touchent à la conception (je veux faire quoi) et à comment le réaliser.

                Si on doit avoir plusieurs albums de Supertramp et d'autres groupes que ... peut être qu'on pourrait avoir un dictionnaire où la clef serait le groupe associé aux albums? Est ce que ces albums sont une simple liste contenant des tuples (le nom de l'album, l'année, les titres) ou est-ce qu'on en fait un dictionnaire dont la clef serait l'année? le titre? autre chose.

                Tout dépend de ce qu'on veut faire.

                • Partager sur Facebook
                • Partager sur Twitter
                  25 juillet 2021 à 13:07:37

                  fred1599 a écrit:

                   Un des exemples qui me vient à l'esprit, est un système de cache qui permet d'aller rechercher l'historique de certaines valeurs de manière optimisée. Voir du côté d'un problème comme Fibonacci par exemple.


                  La suite de Fibonacci ? je ne saisis pas le rapport avec un dictionnaire.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 juillet 2021 à 14:51:26

                    @chrisblues59,

                    Voilà un exemple qui reprend l'idée de ton premier post, ici une liste de dictionnaires :

                    cd = [
                        {
                            "Artiste": "Supertramp",
                            "Album": "Crime Of The Century",
                            "Année": "1974",
                            "Titres": (
                                "School",
                                "Bloody Well Right",
                                "Hide in Your Shell",
                                "Asylum",
                                "Dreamer",
                                "Rudy",
                                "If Everyone Was Listening",
                                "Crime of the Century",
                            ),
                        },
                        {
                            "Artiste": "Genesis",
                            "Album": "Wind and Wuthering",
                            "Année": "1976",
                            "Titres": (
                                "Eleventh Earl of Mar",
                                "One for the Vine",
                                "Your Own Special Way",
                                "Wot Gorilla",
                                "All in a Mouse's Night",
                                "Blood on the Rooftops",
                                "Unquiet Slumbers for the Sleepers",
                                "In That Quiet Earth",
                                "Afterglow",
                            ),
                        },
                        {
                            "Artiste": "Supertramp",
                            "Album": "Even in the quietest moments",
                            "Année": "1977",
                            "Titres": (
                                "Give A Little Bit",
                                "Lover Boy",
                                "Even In The Quietest Moments",
                                "Downstream",
                                "Babaji",
                                "From Now On",
                                "Fool's Overture",
                            ),
                        },
                    ]
                    
                    
                    def show_all():
                        for album in cd:
                            for key, value in album.items():
                                if key == "Titres":
                                    for i, song_name in enumerate(value):
                                        print(f"Piste n°{i+1}: {song_name}")
                                else:
                                    print(f"{key} : {value}")
                            print("")
                    
                    
                    def find_song_name(name):
                        find = False
                        for album in cd:
                            for i, song_name in enumerate(album["Titres"]):
                                if song_name == name:
                                    find = True
                                    print("Titre trouvé...")
                                    print("Artiste : " + album["Artiste"])
                                    print("Album : " + album["Album"])
                                    print("Année : " + album["Année"])
                                    print(f"{name} : Piste n°{i+1}")
                        if find is False:
                            print("Titre non trouvé!!!")
                    
                    
                    show_all()
                    find_song_name("In That Quiet Earth")


                    -
                    Edité par Diablo76 25 juillet 2021 à 15:07:21

                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 juillet 2021 à 16:59:15

                      Bonjour à tous,

                      Tout d'abord, un grand merci à vous tous pour vos réponses : je suis impressionné et je suis "clairement" curieux de décortiquer cette masse d'informations.

                      Le fait d'avoir posé la question en titre indique, de toute façon, que même si je n'en voyais pas l'utilité, j'entrevoyais plus ou moins, et de manière diffuse, que ce procédé pouvait être une solution à une recherche pour une organisation personnelle de mes documents en tous genres : là, je pense à des albums de musique, mais ce peut être aussi ma bibliothèque (de livres, je précise), mes fiches de documentation que je scanne dans des revues diverses, mes vidéos que j'enregistre sur des chaînes thématiques, mes photos sur tous les thèmes (géographie, monuments...) etc., la liste n'est pas exhaustive...  L'un des critères serait donc la nature du document : livre, CD, vidéo, photo, fiche et ainsi de suite, tout cela réuni en un seul dictionnaire !

                      J'ai consulté la documentation (très fournie et très détaillée) de Pascal Ortiz : tu te montres ici presque dithyrambique quant à la création et l'utilisation du dictionnaire, je suis assez surpris de ne pas trouver de chapitre spécifique dans tes productions. Peut-être pourrais-tu y consacrer un dossier...

                      D'après vos réponses à tous, je crois que je peux envisager la constitution d'un dictionnaire construit de la sorte : si vous avez des avis, quels qu'ils soient, n'hésitez pas à me les soumettre.

                      Merci encore à vous tous, et en particulier à Diablo 76 pour son script qui me donne des idées (enthousiasmantes ! La création d'index apporterait aussi une méthode de recherche efficace).

                      Cordialement.

                      -
                      Edité par chrisblues59 25 juillet 2021 à 17:12:19

                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 juillet 2021 à 18:41:48

                        chrisblues59 a écrit:

                        là, je pense à des albums de musique, mais ce peut être aussi ma bibliothèque (de livres, je précise), mes fiches de documentation que je scanne dans des revues diverses, mes vidéos que j'enregistre sur des chaînes thématiques, mes photos sur tous les thèmes (géographie, monuments...) etc., la liste n'est pas exhaustive...  L'un des critères serait donc la nature du document : livre, CD, vidéo, photo, fiche et ainsi de suite, tout cela réuni en un seul dictionnaire !

                        Une petite base de données avec sqlite serait bien plus adapté pour ce genre de choses.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 juillet 2021 à 18:58:26

                          Ah ! Bon... Pourquoi pas ! J'en prends note, MPS.

                          C'est aussi le genre de questions que je me posais, et c'est pourquoi je m'adresse au forum pour m'éclaircir les idées.

                          Mais une petite question : une base de données peut se construire avec une structure en dictionnaire, non ? 

                          Merci de ton avis.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            25 juillet 2021 à 18:58:53

                             PascalOrtiz a écrit:

                            La suite de Fibonacci ? je ne saisis pas le rapport avec un dictionnaire.

                            https://www.python-course.eu/python3_memoization.php

                            Diablo76 a écrit:

                            @fred1599,

                            Un problème à tout ou une solution à tout ?? :D:p

                            Oui solution, sorry ;)
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                            La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                              25 juillet 2021 à 19:12:43

                              Pour corroborer le dernier message d'mps : https://sebsauvage.net/links/?L9oN2A
                              • Partager sur Facebook
                              • Partager sur Twitter
                                25 juillet 2021 à 21:59:02

                                fred1599 a écrit:

                                 PascalOrtiz a écrit:

                                La suite de Fibonacci ? je ne saisis pas le rapport avec un dictionnaire.

                                https://www.python-course.eu/python3_memoization.php


                                Admettons mais on n'a pas besoin de dictionnaire pour ça, une simple liste suffit. Par ailleurs, si tu veux calculer fibo(400) tu vas créer un dictionnaire de 400 valeurs alors qu'en fait le calcul courant n'a besoin que de stocker juste deux valeurs, le choix me paraît donc discutable. Une façon classique de contourner ce problème de cache est d'écrire le code suivant :

                                def fibo(n, a, b):
                                    if n==0:
                                        return a
                                    return fibo(n-1, b, a+b)
                                
                                print(fibo(997,0, 1))

                                La fonction est toujours récursive, il n'y a aucun stockage et, en plus, on peut calculer des valeurs de la suite pour des indices deux fois plus grand (dans ton lien, tu auras, sur l'implémentation courante de Python, une recursion error pour n autour de 500).

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  25 juillet 2021 à 23:05:04

                                  Fibonacci n'était qu'un exemple et peut être pas le bon, c'est le principe de cache et l'utilisation du dictionnaire qui est important.
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                  La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                    25 juillet 2021 à 23:12:57

                                    chrisblues59 a écrit:

                                    Mais une petite question : une base de données peut se construire avec une structure en dictionnaire, non ? 

                                    Merci de ton avis.

                                    Regardez le code de Diablo76, c'est juste du code Python. Comment ajouter un nouvel album sans éditer le source? Est-il raisonnable que les utilisateurs soient assez bons programmeurs pour le faire? Plutôt que mettre çà dans un script Python on pourrait en faire un fichier JSON (çà c'est éditable pas l'utilisateur lambda) et se retrouver à lire tout le fichier au démarrage du programme et en créer une nouvelle version à chaque mise à jour.

                                    Une base de donnée (à la sqlite) serait plus souple pour faire des recherches, ajouter un album,... c'est fait pour.

                                    Un dictionnaire n'est pas là pour organiser des données "utilisateur" mais pour organiser les objets du programme. On peut récupérer cette structure en ayant récupéré le contenu d'un fichier JSON et on va faire avec.... bien obligé mais il ne faut pas tout confondre.

                                    Vous êtes perdu dans tout çà? Normal... vous découvrez Python et Python ouvre la porte vers le monde de la programmation et de l'informatique. Pas facile de s'y repérer. Mais c'est comme çà.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      26 juillet 2021 à 16:10:17

                                      Bonjour à tous,

                                      MPS, j'ai bien pris conscience que la présence des accolades ne signifiait pas toujours qu'un dictionnaire avait été mis en œuvre. Dans ce cas précis, ce n'en est pas un.

                                      Mais, dans mes consultations sur le net, je suis souvent tombé sur ce procédé du dictionnaire : la lecture des explications m'a interpellé, cependant, je doutais de son utilité par rapport à mon projet, et c'est pourquoi j'ai soumis ma question au forum.

                                      A vous lire, MPS, je redeviens dubitatif : "Une petite base de données avec sqlite serait bien plus adapté pour ce genre de choses."

                                      Effectivement, quelle que soit la masse des documents que je pourrais apporter dans mon projet, à mon niveau, au niveau d'un individu dans son propre environnement, elle serait amplement suffisante. L'idée du dictionnaire vient du fait que j'ai envie que ce soit performant : alors, quand je lis Fred 1599 : "Ça accélère la recherche à tel point que c'est quasi instantanée, encore faut-il avoir à rechercher, à créer correctement sa structure..." ou Pascal Ortiz : "C'est une structure de données fondamentales, [...] Les exemples d'usage de dictionnaires sont innombrables.", ça fait "tilt".

                                      Bon, en attendant, je vais m'occuper de mes petits scripts d'entraînement à sqlite :  j'ai besoin de quelque temps pour réfléchir.

                                      Merci à tous.

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Quel est l'intérêt du dictionnaire Python ?

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      • Editeur
                                      • Markdown