Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tri de liste

Sujet résolu
    12 décembre 2011 à 21:36:07

    Voilà, j'aimerais savoir comment trier une liste de tulpes... Ce n'est pas la solution qui m'intéresse, mais plutôt les explications...
    Regardez :
    >>>inv = [("Pomme", 18), ("Orange", 10), ("Fraise", 17),("Poire", 21)]
    

    J'aimerais qu'il ressorte un tri par quantité... Comme ce ci :

    >>>inv
    >>>[("Poire", 21), ("Pomme", 18), ("Fraise", 17), ("Orange", 10)]
    

    Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      12 décembre 2011 à 22:41:33

      L'argument "key" de la fonction "sorted" te sera utile.
      • Partager sur Facebook
      • Partager sur Twitter
      yjltg.
        13 décembre 2011 à 0:52:48

        Citation : pierrot1105

        Voilà, j'aimerais savoir comment trier une liste de tulpes... Ce n'est pas la solution qui m'intéresse, mais plutôt les explications...



        Ta demande est un peu vague, tout dépend de ton niveau en Python, de ta capacité d'assimilation et de tes motivations. Plusieurs solutions sont envisageables, comme l'utilisation de la fonction sorted et de ses options (ça peut être compliqué) ou un tri tout bête (genre tri par sélection) que tu écris toi-même.
        • Partager sur Facebook
        • Partager sur Twitter
          13 décembre 2011 à 7:14:22

          Citation : candide

          Citation : pierrot1105

          Voilà, j'aimerais savoir comment trier une liste de tulpes... Ce n'est pas la solution qui m'intéresse, mais plutôt les explications...



          Ta demande est un peu vague, tout dépend de ton niveau en Python, de ta capacité d'assimilation et de tes motivations. Plusieurs solutions sont envisageables, comme l'utilisation de la fonction sorted et de ses options (ça peut être compliqué) ou un tri tout bête (genre tri par sélection) que tu écris toi-même.


          Ah en effet, je viens de relire mon post, et j'ai completement oublié de préciser que j'aurais aimé le faire avec sorted..

          Comme l'a dit quelqun_d'autre, je savais qu'il fallait un argumet comme key, mais je ne comprends pas comment configurer cet argument...

          Merci d'avance !
          • Partager sur Facebook
          • Partager sur Twitter
            13 décembre 2011 à 10:56:19

            Citation : pierrot1105


            Comme l'a dit quelqun_d'autre, je savais qu'il fallait un argumet comme key,!



            Il y a deux méthodes, cf. le code auto-explicatif suivant :

            # -*- coding: utf-8 -*-
            # Options de la fonction sorted
            # Python 2.x
            
            inv = [
                ("Pomme", 18), ("Orange", 10),
                ("Fraise", 17),("Poire", 21)]
            
            # 1ère méthode
            def ma_cmp(x,y):
                # Je compare par rapport à la 2ème (ie indice 1) 
                # composante de chaque élément
                # ici x et y
                return cmp(x[1],y[1])
            
            # comparaison suivant la 2ème composante de chaque tuple
            # ici comparaison suivant les nombres de inv
            print sorted(inv, cmp=ma_cmp)
            
            # 2ème méthode
            def ma_clef(x):
                # la fonction par comparaison de Python s'applique
                # à la 2ème composante (indice 1) de chaque élément à comparer
                return x[1]
            
            print
            # comparaison suivant la 2ème composante de chaque tuple
            # ici comparaison suivant les nombres de inv
            print sorted(inv, key=ma_clef)
            

            [('Orange', 10), ('Fraise', 17), ('Pomme', 18), ('Poire', 21)]
            
            [('Orange', 10), ('Fraise', 17), ('Pomme', 18), ('Poire', 21)]
            • Partager sur Facebook
            • Partager sur Twitter
              13 décembre 2011 à 11:22:51

              je préfère utiliser lambda ...


              inv = [("Pomme", 18), ("Orange", 10),("Fraise", 17),("Poire", 21)]
              sorted(inv,key=lambda x:x[1],reverse=True)
              

              [('Poire', 21), ('Pomme', 18), ('Fraise', 17), ('Orange', 10)]


              • Partager sur Facebook
              • Partager sur Twitter

              Python c'est bon, mangez-en. 

                13 décembre 2011 à 11:28:28

                Citation : josmiley

                je préfère utiliser lambda ...



                Ou pourquoi faire clair quand on peut faire obscur ?
                • Partager sur Facebook
                • Partager sur Twitter
                  13 décembre 2011 à 14:54:36

                  Le tri par quantité, c'est la version x[1] et reverse=true.
                  (@ Candide, tu as fait un tri alphabétique.)

                  Mais ce qui compte c'est la version qui est la plus claire.
                  Pour moi lambda est claire, mais elle peut dérouter, c'est vrai.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 décembre 2011 à 16:39:30

                    Citation : candide

                    Ou pourquoi faire clair quand on peut faire obscur ?


                    Je préfère encore une lambda qu'une fonction appelée "clef" qui est tout sauf explicite...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 décembre 2011 à 18:20:03

                      Citation : candide

                      Citation : pierrot1105


                      Comme l'a dit quelqun_d'autre, je savais qu'il fallait un argumet comme key,!



                      Il y a deux méthodes, cf. le code auto-explicatif suivant :

                      # -*- coding: utf-8 -*-
                      # Options de la fonction sorted
                      # Python 2.x
                      
                      inv = [
                          ("Pomme", 18), ("Orange", 10),
                          ("Fraise", 17),("Poire", 21)]
                      
                      # 1ère méthode
                      def je_compare_suivant_x(x,y):
                          return cmp(x[0],y[0])
                      
                      print sorted(inv, cmp=je_compare_suivant_x)
                      
                      # 2ème méthode
                      def clef(x):
                          return x[0]
                      
                      print
                      print sorted(inv, key=clef)
                      


                      [('Fraise', 17), ('Orange', 10), ('Poire', 21), ('Pomme', 18)]
                      
                      [('Fraise', 17), ('Orange', 10), ('Poire', 21), ('Pomme', 18)]

                      Tout d'abord, merci de m'avoir répondu. Mais effectivement, je voulais trier selon la quantité... De plus, je ne comprends pas très bien ton code...

                      Mais par contre :

                      Citation : josmiley

                      inv = [("Pomme", 18), ("Orange", 10),("Fraise", 17),("Poire", 21)]
                      sorted(inv,key=lambda x:x[1],reverse=True
                      


                      Je préfère cette méthode que j'ai tout de suite accrochée et surtout, comprise. Je pense que chacun ses gouts, personne n'est en mesure de dire : ça c'est mieux que ça par ce que blablabla... Ce sont des préférences ..

                      Merci à tous ! Bonne soirée, et à bientôt sur le SDZ !
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        13 décembre 2011 à 18:40:46

                        >>> inv = [("Pomme", 18), ("Orange", 10), ("Fraise", 17),("Poire", 21)]
                        >>> from operator import itemgetter
                        >>> sorted(inv, key=itemgetter(1))
                        [('Orange', 10), ('Fraise', 17), ('Pomme', 18), ('Poire', 21)]
                        >>> sorted(inv, key=itemgetter(1), reverse = True)
                        [('Poire', 21), ('Pomme', 18), ('Fraise', 17), ('Orange', 10)]
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 décembre 2011 à 18:54:15

                          Citation : fred1599

                          >>> inv = [("Pomme", 18), ("Orange", 10), ("Fraise", 17),("Poire", 21)]
                          >>> from operator import itemgetter
                          >>> sorted(inv, key=itemgetter(1))
                          [('Orange', 10), ('Fraise', 17), ('Pomme', 18), ('Poire', 21)]
                          >>> sorted(inv, key=itemgetter(1), reverse = True)
                          [('Poire', 21), ('Pomme', 18), ('Fraise', 17), ('Orange', 10)]
                          

                          J'avais aussi vu cette façon, mais j'ai laissé tomber par ce que c'était mal expliqué.. Si tu veux bien l'expliquer, je suis aussi preneur ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 décembre 2011 à 19:46:56

                            Citation : fred1599

                            va voir là!


                            Super bien expliqué ! Merci à toi !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              13 décembre 2011 à 20:11:36

                              On peut aussi faire recréer très facilement une fonction semblable :
                              def getItemAtIndex(i):
                                  def _getItem(container):
                                      return container[i]
                                  return _getItem
                              
                              inv = [("Pomme", 18), ("Orange", 10), ("Fraise", 17),("Poire", 21)]
                              print(sorted(inv, key=getItemAtIndex(1)))
                              

                              Ça a le mérite d'être plutôt simple à comprendre : effectuer le tri avec l'élément de la liste situé à la position 1.

                              Anecdote un peu inutile : je pensais justement à poster une fonction du genre tout à l'heure, et avant que fred1599 ne poste je ne savais même pas que ça existait déjà.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                13 décembre 2011 à 21:06:40

                                Citation : Fayden

                                On peut aussi faire recréer très facilement une fonction semblable :

                                def getItemAtIndex(i):
                                    def _getItem(container):
                                        return container[i]
                                    return _getItem
                                
                                inv = [("Pomme", 18), ("Orange", 10), ("Fraise", 17),("Poire", 21)]
                                print(sorted(inv, key=getItemAtIndex(1)))
                                


                                Ça a le mérite d'être plutôt simple à comprendre : effectuer le tri avec l'élément de la liste situé à la position 1.

                                Anecdote un peu inutile : je pensais justement à poster une fonction du genre tout à l'heure, et avant que fred1599 ne poste je ne savais même pas que ça existait déjà.


                                Effectivement, encore une possibilité ;)
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Tri de liste

                                × 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