Partage
  • Partager sur Facebook
  • Partager sur Twitter

Trier un dictionnaire par valeur

    10 novembre 2017 à 11:10:24

    Bonjour,

    est t-il possible de trier un dict par valeur, exemple :

    inventaire = {
    ...     "pommes" : 22,
    ...     "melons" : 4),
    ...     "poires" : 18,
    ...     "fraises" : 76,
    ...     "prunes" : 51,
    ... {

    Et je veux obtenir ça :

    {
        "fraises" : 76,
        "prunes" : 51,
        "pommes" : 22,
        "poires" : 18,
        "melons" : 4,
    }

    Je ne sais pas utiliser les fonctions comme reversed et autres truc compliqué, je ne suis qu'à là dans le tutoriel : https://openclassrooms.com/courses/apprenez-a-programmer-en-python/les-dictionnaires-2

    Je connais la fonction sorted, je connais aussi values, items et toutes les méthodes de dict.

    J'ai trié les valeurs avec values, sauf que ça m'affiche que les valeurs et ça n'envoie pas les clés, je ne sais pas comment reconstruire le dictionnaire.



    • Partager sur Facebook
    • Partager sur Twitter
      10 novembre 2017 à 15:19:50

      potterman28wxcv a écrit:

      Une petite recherche Google: sort dictionary by value python

      https://stackoverflow.com/questions/613183/how-to-sort-a-dictionary-by-value


      Je préfère une réponse en français, et il y a des choses que je ne maîtrise pas sur ce site
      • Partager sur Facebook
      • Partager sur Twitter
        10 novembre 2017 à 16:06:04

        Tout d'abord une solution :

        d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
        for key in sorted(d, key = d.get, reverse=True) :
            print (key, d[key])

        Pour comprendre comment ça marche, il faut déjà comprendre comment fonctionne sorted. Généralement lorsque l'on utilise cette fonction, on lui passe un itérable, et le travail attendu est fait. Il n'y a cependant rien de magique ici, lors d'un tri il y a forcément comparaison de valeurs et python utilise des fonctions bien spécifiques et propre à chaque types/objet. Prenons un exemple simple :

        l = ["aa", "a", "b"]
        sorted(l)
        
        # ['a', 'aa', 'b']

        Nous avons ici le comportement natif de la comparaison d'un string à un autre, si l'on fait :

        'b' > 'aa' > 'a'

        On aura comme résultat True. Maintenant imagine que tu souhaites trier ta liste uniquement par la longueur de la chaîne. Pour bypasser la comparaison directe des éléments de ton itérable, la fonction sorted te propose de passer par un argument spécifique appelé key. L'idée est que key doit être une fonction qui te retourne une valeur, et ce sera cette valeur qui sera utilisée pour comparer chaque élément. Le plus souvent (ou pas), on passe par une fonction anonyme mais tu peux utiliser n'importe quelle fonction :

        sorted(l, key = lambda x : len(x))
        
        # ['a', 'b', 'aa']

        Le même code sans fonction anonyme :

        def ma_fonction(chaine) :
            return len(chaine)
        
        sorted(l, key = ma_fonction)

        Note ici que l'on n'utilise pas de parenthèses, en effet on envoie véritablement la fonction en argument, qui sera appelée par la suite par sorted.

        Maintenant revenons à notre réponse du départ. Ici on utilise la fonction get, qui donne un résultat similaire au comportement natif lorsque l'on recherche une clé existante dans un dictionnaire :

        d = {'apple': 4, 'banana': 3, 'orange': 2, 'pear': 1}
        
        d["apple"] # > 4
        d.get("apple") # > 4

        Dans notre cas, du coup, on trie les clés en fonction de leur valeur, et par la suite on accède au résultat en itérant sur ces clés. Il faut savoir que la méthode get est utilisé ici, mais on pourrait passer par la méthode "standard" utilisé avec les [] qui n'est qu'une écriture permettant d'appeler la fonction __getitem__ :

        for key in sorted(d, key=d.__getitem__) :
            print (key, d[key])

        Pour info :

        D'un point de vue performance, cette méthode est bonne si ton dictionnaire n'est pas grand et si tu n'as pas besoin de réaliser beaucoup de fois cette manœuvre. Les dictionnaires sont implémentés en python grâce à une table de hachage permettant d'obtenir un accès extrêmement rapide à partir d'une clé en O(1). Cependant la structure des dictionnaires ne permet pas la tri des clé. A partie de la version 3.6 (et maintenant ça deviendra officiel pour la version 3.7), les dictionnaires deviennent nativement ordonnés (ce qui ne veut pas dire triés !) ce qui permet de réaliser cette opération de tri qu'une seule fois, à moins qu'on rajoute de nouvelles valeurs, auquel cas un nouveau tri sera nécessaire. Pour les précédentes versions, les OrderedDict peuvent être utilisés.

        -
        Edité par Jevanni 10 novembre 2017 à 16:10:43

        • Partager sur Facebook
        • Partager sur Twitter
          10 novembre 2017 à 16:07:14

          Salut,

          EDIT: (Je me suis fait devancer, vous êtes chanceux :ange::-°)

          Vous avez pas vraiment besoin d'explication, le site permet d'avoir les mots-clef pour faire des recherches par vous-même.

          Comme: 

          • operator.itemgetter()
          • sorted(.., key=lambda x: ...)
          • collections.defaultdict

          Ensuite, suffit de faire une recherche dans le forum python sur OC.

          Sinon, suffit de connaître un site de recherche... google, bing, yahoo, ..

          Bonne chance

          A+

          -
          Edité par nolimitech 10 novembre 2017 à 16:08:40

          • Partager sur Facebook
          • Partager sur Twitter
            10 novembre 2017 à 16:30:06

            BastienPortigo a écrit:

            potterman28wxcv a écrit:

            Une petite recherche Google: sort dictionary by value python

            https://stackoverflow.com/questions/613183/how-to-sort-a-dictionary-by-value


            Je préfère une réponse en français, et il y a des choses que je ne maîtrise pas sur ce site


            Je te cite toi même

            BastienPortigo a écrit:

            Je connais la fonction sorted, je connais aussi values, items et toutes les méthodes de dict.

            Sur le site que j'ai indiqué, sorted (et l'argument key de la fonction sorted) c'est absolument tout ce qu'ils utilisent, et la solution tient en 3 lignes. Qu'est ce que tu ne maitrises pas sur le lien que je t'ai fourni ?

            Je ne veux pas te casser les pieds, mais si l'anglais te rebute au point de ne pas chercher sur les sites anglais, tu ne risques pas d'aller bien loin en programmation. On est tous passés par là, et moi le premier (c'est rare de naître bilingue) ; à force de lire l'anglais tu vas voir que c'est pas si compliqué que ça, surtout l'anglais informatique. Une grosse partie de la programmation passe avant tout par savoir faire une recherche sur internet et collecter les infos afin de ne pas avoir à réinventer la roue à chaque fois ;)

            -
            Edité par potterman28wxcv 10 novembre 2017 à 16:31:36

            • Partager sur Facebook
            • Partager sur Twitter
              13 novembre 2017 à 11:10:33

              Ah je tiens à préciser je n'ai pas encore appris le fonctionnement "key" de la fonction sorted, on peut trier le dictionnaire sans ?
              • Partager sur Facebook
              • Partager sur Twitter
                13 novembre 2017 à 11:51:19

                BastienPortigo a écrit:

                Ah je tiens à préciser je n'ai pas encore appris le fonctionnement "key" de la fonction sorted, on peut trier le dictionnaire sans ?


                key c'est la fonction qu'il va utiliser pour trier ; c'est à dire qu'il va ranger les éléments selon les valeurs de key(element)

                import operator
                x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
                sorted_x = sorted(x.items(), key=operator.itemgetter(1))
                • print(x.items()) --> [(1, 2), (3, 4), (4, 3), (2, 1), (0, 0)] ; c'est à dire, une liste de tuples avec (clé, dict(clé))
                • operator.itemgetter(1) : la fonction qui à un tuple, associe le 2ème élément. C'est à dire (operator.itemgetter(1))(3, 4) == 4

                ça va donc trier tes éléments selon les valeurs de (operator.itemgetter(1))(element) ; c'est à dire selon le deuxième élément. Ce qui est a priori ce que tu veux.

                C'est certes en anglais, mais c'est expliqué tout aussi bien si tu fais une recherche "key sorted python" sur Google, et tombe sur ça :)

                -
                Edité par potterman28wxcv 13 novembre 2017 à 11:52:43

                • Partager sur Facebook
                • Partager sur Twitter
                  14 novembre 2017 à 9:07:12

                  potterman28wxcv a écrit:

                  BastienPortigo a écrit:

                  Ah je tiens à préciser je n'ai pas encore appris le fonctionnement "key" de la fonction sorted, on peut trier le dictionnaire sans ?


                  key c'est la fonction qu'il va utiliser pour trier ; c'est à dire qu'il va ranger les éléments selon les valeurs de key(element)

                  import operator
                  x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
                  sorted_x = sorted(x.items(), key=operator.itemgetter(1))
                  • print(x.items()) --> [(1, 2), (3, 4), (4, 3), (2, 1), (0, 0)] ; c'est à dire, une liste de tuples avec (clé, dict(clé))
                  • operator.itemgetter(1) : la fonction qui à un tuple, associe le 2ème élément. C'est à dire (operator.itemgetter(1))(3, 4) == 4

                  ça va donc trier tes éléments selon les valeurs de (operator.itemgetter(1))(element) ; c'est à dire selon le deuxième élément. Ce qui est a priori ce que tu veux.

                  C'est certes en anglais, mais c'est expliqué tout aussi bien si tu fais une recherche "key sorted python" sur Google, et tombe sur ça :)

                  -
                  Edité par potterman28wxcv il y a environ 21 heures

                  Ma question est de savoir si c'est possible de le faire sans, si ce n'est pas possible alors je serais donc obligé de l'utiliser

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    14 novembre 2017 à 10:39:36

                    Il te suffit de comprendre à quoi sert l'argument key et tu pourras l'utiliser insouciamment. Jevanni donne une bonne explication ci-dessus, il y a quelque chose en particulier que tu n'aurais pas compris dans son poste ?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 novembre 2017 à 10:51:15

                      IdiotBête_ a écrit:

                      Il te suffit de comprendre à quoi sert l'argument key et tu pourras l'utiliser insouciamment. Jevanni donne une bonne explication ci-dessus, il y a quelque chose en particulier que tu n'aurais pas compris dans son poste ?


                      Dans sa méthode utilisé on peut pas bloquer le résultat dans une variable, et en plus j'ai pas tout compris, en réalité dans le tutoriel, on vient d'apprendre comment parcourir des dictionnaires avec des clé, avec des valeurs et avec les deux grâce à items, et il donne cet exercice, donc en toute logique pourquoi nous faire apprendre ça si c'est pas pour l’utiliser dans l'exercice, ça n'a absolument aucun sens, du coup je pense qu'il faut se débrouiller avec ça, même si j'ai essayé et que ça ne donne aucun résultat, je suis en train de me demander si c'est vraiment possible de faire son truc, car même avec key de la fonction sorted ça ne modifie pas la liste d'origine de toute façon
                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 novembre 2017 à 11:15:46

                        Tu peux effectivement te débrouiller sans keys, avec juste la méthode items et les opérations sur les listes vues précédemment.

                        En effet, sorted ne modifie pas l'objet passé en paramètre, ça tombe bien, ce n'est pas ce que tu souhaites. Tu souhaites obtenir en sortie une liste triée de couples (fruit, quantité).

                        -
                        Edité par entwanne 14 novembre 2017 à 11:16:05

                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 novembre 2017 à 11:20:48

                          entwanne a écrit:

                          Tu peux effectivement te débrouiller sans keys, avec juste la méthode items et les opérations sur les listes vues précédemment.

                          En effet, sorted ne modifie pas l'objet passé en paramètre, ça tombe bien, ce n'est pas ce que tu souhaites. Tu souhaites obtenir en sortie une liste triée de couples (fruit, quantité).

                          -
                          Edité par entwanne il y a 2 minutes


                          Oui voilà, une idée de commentaire faire avec juste items ? Pour info le cour est là https://openclassrooms.com/courses/apprenez-a-programmer-en-python/les-dictionnaires-2

                          Je suis à Parcours des clés et valeurs simultanément et il met l'exercice dans cette catégorie, sauf que j'ai l'impression que c'est littéralement impossible

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            14 novembre 2017 à 11:44:05

                            Tu peux effectivement faire comme dans le chapitre précédent puisque la méthode items te permet de construire une liste de tuples (la même structure de données que celle que tu as vu précédemment).

                            • Partager sur Facebook
                            • Partager sur Twitter
                              14 novembre 2017 à 11:46:28

                              Message deleted

                              -
                              Edité par potterman28wxcv 14 novembre 2017 à 11:49:47

                              • Partager sur Facebook
                              • Partager sur Twitter
                                15 novembre 2017 à 14:47:30

                                Bon voilà, alors j'ai fini l'exercice, mais je suis pas sûr que ce que j'ai fait est bien.

                                En gros j'ai utilisé la fonction items qui est une méthode de dict en créant une autre variable (inventaire_2) :

                                inventaire_2 = inventaire.items()

                                j'ai eu un dict items, et j'ai pu faire des compréhensions de list, au final le résultat est :

                                inventaire
                                [('fraises', 76), ('prunes', 51), ('pommes", 22), ('poires', 18), ('melons', 4)]

                                Le problème c'est que vous avez vu l'exercice est fait, mais l'inventaire n'est plus un dictionnaire mais une liste avec des tuples, on peut pas trier un dictionnaire en le laissant dictionnaire sans utiliser key de sorted ?

                                Enfin bref au final j'ai converti inventaire à nouveau en dictionnaire


                                • Partager sur Facebook
                                • Partager sur Twitter
                                  15 novembre 2017 à 14:54:07

                                  BastienPortigo a écrit:

                                  Bon voilà, alors j'ai fini l'exercice, mais je suis pas sûr que ce que j'ai fait est bien.

                                  En gros j'ai utilisé la fonction items qui est une méthode de dict en créant une autre variable (inventaire_2) :

                                  inventaire_2 = inventaire.items()

                                  j'ai eu un dict items, et j'ai pu faire des compréhensions de list, au final le résultat est :

                                  inventaire
                                  [('fraises', 76), ('prunes', 51), ('pommes", 22), ('poires', 18), ('melons', 4)]

                                  Le problème c'est que vous avez vu l'exercice est fait, mais l'inventaire n'est plus un dictionnaire mais une liste avec des tuples, on peut pas trier un dictionnaire en le laissant dictionnaire sans utiliser key de sorted ?

                                  Enfin bref au final j'ai converti inventaire à nouveau en dictionnaire


                                  Un dictionnaire en Python n'est pas fait pour être trié. Ce que t'appelles "dictionnaire trié", c'est juste que quand tu le print ça t'affiche les valeurs dans le bon ordre, mais sinon il n'y a absolument aucun ordre dans un dictionnaire.

                                  Dans l'interpréteur :

                                  >>> {"banane": 42, "poire": 23} == {"poire": 23, "banane": 42}
                                  True
                                  

                                  Si tu veux avoir une notion d'ordre, faut utiliser des listes.

                                  -
                                  Edité par potterman28wxcv 15 novembre 2017 à 14:54:25

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    15 novembre 2017 à 15:00:42

                                    Ou des dictionnaires ordonnés (collections.OrderedDict) pour qui l'ordre des données a de l'importance.

                                    À noter aussi que depuis Python 3.6, l'ordre d'insertion des éléments dans les dictionnaires est conservé, sans que ça n'ait la moindre influence sur l'égalité entre dictionnaires.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      15 novembre 2017 à 15:35:06

                                      Mon précédent post ne s'est pas affiché ou alors c'était absolument pas clair ?

                                      -
                                      Edité par Jevanni 15 novembre 2017 à 15:35:17

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        15 novembre 2017 à 16:19:38

                                        Jevanni a écrit:

                                        Mon précédent post ne s'est pas affiché ou alors c'était absolument pas clair ?

                                        -
                                        Edité par Jevanni il y a 39 minutes


                                        Ah non non, il s'est bien affiché, et il était sûrement très clair, mais vois-tu, si une personne vient d'apprendre à compter et qu'on essaie de lui apprendre l'Algèbre ça ne fonctionnera pas, malgrè une bonne explication, il faut d'abord apprendre les additions, ensuite les soustractions et les multiplications, et ainsi de suite.

                                        Là c'est un peu pareil, je préfère apprendre dans l'ordre et ne pas sauter les étapes, je ne maîtrise pas encore le key de la fonction sorted en réalité, et j'ai vu qu'on allait apprendre ça dans la suite du tutoriel, du coup ce n'était pas ce qui m'était demandé dans l'exercice, car je venais d'apprendre à utiliser items et autres, tout simplement.

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          15 novembre 2017 à 16:40:07

                                          BastienPortigo a écrit:

                                          Jevanni a écrit:

                                          Mon précédent post ne s'est pas affiché ou alors c'était absolument pas clair ?

                                          -
                                          Edité par Jevanni il y a 39 minutes


                                          Ah non non, il s'est bien affiché, et il était sûrement très clair, mais vois-tu, si une personne vient d'apprendre à compter et qu'on essaie de lui apprendre l'Algèbre ça ne fonctionnera pas, malgrè une bonne explication, il faut d'abord apprendre les additions, ensuite les soustractions et les multiplications, et ainsi de suite.

                                          Là c'est un peu pareil, je préfère apprendre dans l'ordre et ne pas sauter les étapes, je ne maîtrise pas encore le key de la fonction sorted en réalité, et j'ai vu qu'on allait apprendre ça dans la suite du tutoriel, du coup ce n'était pas ce qui m'était demandé dans l'exercice, car je venais d'apprendre à utiliser items et autres, tout simplement.


                                          C'est pas super sympa d'ignorer un post quand quelqu'un y a passé un certain temps pour te répondre, et que c'est bien expliqué. C'est encore moins sympa de prendre un ton condescendant pour expliquer pourquoi tu n'as pas lu le post.

                                          On fait ça sur notre temps libre, la moindre des choses est que tu prêtes attention à ce qu'on écrit, surtout quand c'est des posts aussi bien expliqués que celui de Jevanni.

                                          -
                                          Edité par potterman28wxcv 15 novembre 2017 à 16:40:56

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Anonyme
                                            15 novembre 2017 à 16:41:08

                                            Après il ne faut pas être trop frileux non-plus. La notion de fonction passé en argument d'une autre fonction pourrait même être vue dès l'instant où l'on apprend ce qu'est une fonction (d'ailleurs ça devrait être le cas pour tous les cours qui utilise Python).

                                            Mais si c'est juste le comportement d'une fonction que tu ne comprends pas, il n'y a pas d'ordre à respecter. Et dans le cas de la fonction sorted, l'explication de Jevanni est très bien.

                                            -
                                            Edité par Anonyme 15 novembre 2017 à 16:41:29

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              15 novembre 2017 à 16:55:32

                                              potterman28wxcv a écrit:

                                              BastienPortigo a écrit:

                                              Jevanni a écrit:

                                              Mon précédent post ne s'est pas affiché ou alors c'était absolument pas clair ?

                                              -
                                              Edité par Jevanni il y a 39 minutes


                                              Ah non non, il s'est bien affiché, et il était sûrement très clair, mais vois-tu, si une personne vient d'apprendre à compter et qu'on essaie de lui apprendre l'Algèbre ça ne fonctionnera pas, malgrè une bonne explication, il faut d'abord apprendre les additions, ensuite les soustractions et les multiplications, et ainsi de suite.

                                              Là c'est un peu pareil, je préfère apprendre dans l'ordre et ne pas sauter les étapes, je ne maîtrise pas encore le key de la fonction sorted en réalité, et j'ai vu qu'on allait apprendre ça dans la suite du tutoriel, du coup ce n'était pas ce qui m'était demandé dans l'exercice, car je venais d'apprendre à utiliser items et autres, tout simplement.


                                              C'est pas super sympa d'ignorer un post quand quelqu'un y a passé un certain temps pour te répondre, et que c'est bien expliqué. C'est encore moins sympa de prendre un ton condescendant pour expliquer pourquoi tu n'as pas lu le post.

                                              On fait ça sur notre temps libre, la moindre des choses est que tu prêtes attention à ce qu'on écrit, surtout quand c'est des posts aussi bien expliqués que celui de Jevanni.

                                              -
                                              Edité par potterman28wxcv il y a 6 minutes


                                              J'ai lu intégralement son post, d'ailleurs si tu prends le temps de lire les messages précédents tu verras que j'ai testé la méthode de Jevanni, mais que je ne mets pas en pratique les leçons du cours, ce qui n'a pas beaucoup de sens, je remercie cette personne d'avoir pris le temps de m'aider.

                                              Je n'ai pas assez de recul pour te dire si je suis condescendant ou pas, mais si c'est bien le cas, je m'en excuse d'avance, ce n'est pas mon but de cracher dans la main des personnes qui veulent me venir en aide.

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Trier un dictionnaire par valeur

                                              × 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.
                                              • Editeur
                                              • Markdown