Tri en python

Date 26 février 2016 Catégories Developpement par VulgaireDev

En C/C++, quand on veut faire un tri, on peut définir une fonction de comparaison, qui prend en entrée deux entités de la collection qu'on veut trier, et nous donne la façon de les comparer. Cette fonction est ensuite utilisée par sort() pour trier comme on le souhaite.

Ex:

//admettons qu'on ait une classe Habitation ayant un attribut surface
//si on veut trier selon la surface, on fait:

bool comparaisonSurface(Habitation & i,Habitation & j) 
{
    return (i.surface < j.surface);
}

main()
{
    vector<Habitations> mesHabitations;
    //...
    //on met des objets Habitations dans ce vecteur
    //on trie
    sort(mesHabitations.begin(), mesHabitations.end(), comparaisonSurface);
}

Bien.

En python par contre, on n'utilise plus ça (c'est déconseillé)

On a deux fonctions en python pour trier :

  • sorted(maListe), qui donne une nouvelle liste triée
  • maListe.sort(), qui change maListe

Pour faite l'équivalent de ce qu'on avait en c/c++, on utilise le paramètre nommé key :

def comparaisonSurface(x):
    return x.surface

maListe = []
#on ajoute des Habitation à la liste

maListe.sort(key=comparaisonSurface)

Voyez ça comme donner une étiquette à un objet. Là on dit à python d'associer une étiquette à chaque objet (ici sa surface), et de trier selon cette etiquette. Plus exactement on lui dit comment fabriquer cette etiquette.

On peut même condenser et faire directement :

maListe.sort(key = lambda x: x.surface)

L'avantage de la première methode c'est qu'on peut faire un tri selon différents critères : on trie d'abord selon un attribut, puis selon un autre, ex:

liste = [{"nom":"Michel", "age":22},{"nom":"Denise", "age":21},{"nom":"Maurice", "age":22}]

def mykey(x):
    return -x["age"], x["nom"]

print(sorted(liste,key=mykey))

Ceci nous sortira la liste triée selon l'âge decroissant, puis selon le nom.

Commentaires

blog comments powered by Disqus