Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction sortez

Sujet résolu
    15 janvier 2019 à 8:10:50

    Bonjour à tous !

    J'aurais souhaité savoir si il était possible de ranger une liste de tuple représentant des positions (x, y) dans l'ordre croissant. J'ai effectivement essayé avec la fonction sorted() et j'arrive en effet à ordonner mes positions de la plus proche de (0, 0) à la plus éloignée.

    Si j'utilise le paramètre reverse=True je peux effectuer l'inverse.

    Cependant, serait il possible de ne pas prendre la position (0, 0) comme référence pour mon ordre croissant ? J'aurais souhaiter ordonner mes positions de la plus proche à la plus éloignée d'une positions lambda, (400, 300) par exemple.

    Existe il une astuce avec la fonction sorted() ? ou bien dois-je réaliser ma propre fonction pour ordonner ma liste ?

    D'avance merci pour vos précieux conseils !

    NB: désolé pour la correction auto du titre "sortez" à la place de sorted() je n'avais pas fait attention..

    -
    Edité par Mahu 15 janvier 2019 à 8:12:18

    • Partager sur Facebook
    • Partager sur Twitter
      15 janvier 2019 à 8:12:36

      Ca fait un petit moment que je n'ai pas fait de Python mais je crois que tu as un paramètre du nom de key pour personnaliser le tri avec ta propre fonction ( Qui du coup peut prendre un tuple )
      • Partager sur Facebook
      • Partager sur Twitter
        15 janvier 2019 à 8:30:24

        Pour chacun des tuples, calcul la distance au tuple de référence, stocke tous les résultats dans un dictionnaire à part en associant chaque résultat au tuple qui l'a produit et trie ce dictionnaire en prenant ses clés comme critère de tri : ensuite tu prends toutes les valeurs dans l'ordre de ce dictionnaire et voilà. Bien sûr il faut utiliser un dictionnaire ordonné : https://docs.python.org/3/library/collections.html
        • Partager sur Facebook
        • Partager sur Twitter

        typage structurel ftw

          15 janvier 2019 à 9:13:46

          Le dico est inutile, la proposition de soupeDog est bien, avec la distance euclidienne ça donne :

          import math
          
          liste_points = [(12, -3), (-5, -5), (1, 2), (-3, 2), (0, 2)]
          
          
          def distance(point1, point2):
              x, y = point1
              s, t = point2
              return math.sqrt((x - s) ** 2 + (y - t) ** 2)
          
          
          centre = (12, 0)
          
          liste_ordonnees = sorted(liste_points, key=lambda p: distance(p, centre))
          print(liste_ordonnees)  # [(12, -3), (1, 2), (0, 2), (-3, 2), (-5, -5)]
          

          Au passage, sorted(liste_points) ne trie pas du tout par rapport à la distance de (0, 0).  Ça trie sur le premier indice, puis le deuxième, etc...

          >>> sorted(liste_points)
          [(-5, -5), (-3, 2), (0, 2), (1, 2), (12, -3)]
          >>> sorted(liste_points, key=lambda p: distance(p, (0, 0)))
          [(0, 2), (1, 2), (-3, 2), (-5, -5), (12, -3)]
          




          -
          Edité par thelinekioubeur 15 janvier 2019 à 9:25:51

          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            15 janvier 2019 à 12:28:15

            Le module math dispose d'une fonction pour calculer l’hypoténuse écrite en C (plus rapide).

            def distance(a, b):
                return math.hypot(a[0] - b[0], a[1] - b[1])
            
            • Partager sur Facebook
            • Partager sur Twitter
              15 janvier 2019 à 22:33:43

              Je ne connaissais pas cette "distance euclidienne" c'est exactement ce que je cherchais , merci à vous tous !
              • Partager sur Facebook
              • Partager sur Twitter

              Fonction sortez

              × 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