On aimerait trier les lettres d'un mot dans l'ordre alphabétique.
L'utilisation de sorted
ne suffit pas :
print(sorted("informatique")) # affiche ['a', 'e', 'f', 'i', 'i', 'm', 'n', 'o', 'q', 'r', 't', 'u']
print(sorted("Informatique")) # affiche ['I', 'a', 'e', 'f', 'i', 'm', 'n', 'o', 'q', 'r', 't', 'u']
Pour éviter ce problème des majuscules/minuscules, on pourrait essayer de passer les lettres du mot en minuscules :
print(sorted("informatique".lower())) # affiche ['a', 'e', 'f', 'i', 'i', 'm', 'n', 'o', 'q', 'r', 't', 'u']
print(sorted("Informatique".lower())) # affiche ['a', 'e', 'f', 'i', 'i', 'm', 'n', 'o', 'q', 'r', 't', 'u']
Mais on pourrait vouloir conserver les majuscules existantes dans l'affichage.
Pour remédier à ce problème, on peut signifier dans le critère de comparaison (sans toucher aux deux mots)
que l'on va trier suivant les minuscules :
print(sorted("informatique", key=str.lower)) # affiche ['a', 'e', 'f', 'i', 'i', 'm', 'n', 'o', 'q', 'r', 't', 'u']
print(sorted("Informatique", key=str.lower)) # affiche ['a', 'e', 'f', 'I', 'i', 'm', 'n', 'o', 'q', 'r', 't', 'u']
On dispose d'une liste des 3 notes de 4 élèves ( l'élève 0 a les notes [8,12,9], l'élève 1 les notes [2,18,15]...) :
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
Et on aimerait trier ces résultats suivant le résultat au premier contrôle :
def note1(liste) :
return liste[0]
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
print(sorted(notes, key=note1))# affiche [[2, 18, 15], [8, 12, 9], [10, 11, 12], [14, 13, 17]]
On dispose d'une liste des 3 notes de 4 élèves ( l'élève 0 a les notes [8,12,9], l'élève 1 les notes [2,18,15]...) :
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
Trier ces résultats suivant le résultat au dernier contrôle.
def derniere_note(liste) :
return liste[-1]
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
print(sorted(notes, key=derniere_note))
def derniere_note(liste) :
return liste[-1]
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
notes.sort( key=derniere_note )
print(notes)
On dispose d'une liste des 3 notes de 4 élèves ( l'élève 0 a les notes [8,12,9], l'élève 1 les notes [2,18,15]...) :
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
Trier ces résultats suivant la moyenne de chaque élève.
- avec sorted
- avec sort
- ordre décroissant
def moyenne(liste) :
return sum(liste)/len(liste)
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
print( sorted(notes, key=moyenne ) )
def moyenne(liste) :
return sum(liste)/len(liste)
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
notes.sort( key=moyenne )
print(notes) # affiche [[8, 12, 9], [10, 11, 12], [2, 18, 15], [14, 13, 17]]
print( [ moyenne(controles) for controles in notes ] )
def moyenne(liste) :
return sum(liste)/len(liste)
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
notes.sort( key=moyenne, reverse=True )
print(notes)
ou avec sorted
:
def moyenne(liste) :
return sum(liste)/len(liste)
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
print( sorted(notes, key=moyenne, reverse=True)
On dispose d'une liste des 3 notes de 4 élèves ( l'élève 0 a les notes [8,12,9], l'élève 1 les notes [2,18,15]...) :
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
Trier ces résultats suivant l'amplitude (écart entre la plus grande valeur et la plus petite valeur d'une liste).
- avec sorted
- avec sort
- tri par amplitude décroissante
def amplitude(liste) :
return max(liste)-min(liste)
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
print( sorted(notes, key=amplitude ) )
def amplitude(liste) :
return max(liste)-min(liste)
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
notes.sort(key=amplitude)
print( notes )
def amplitude(liste) :
return max(liste)-min(liste)
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
notes.sort(key=amplitude, reverse=True)
print( notes )
ou encore :
def amplitude(liste) :
return max(liste)-min(liste)
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
print( sorted(notes, key=amplitude, reverse=True) )
On peut également trier des objets définis par le programmeur.
class Eleve :
def __init__(self, nom, *notes) :
self.nom = nom
self.notes = list(notes)
@property
def moyenne(self) :
return sum(self.notes)/len(self.notes)
def __repr__(self) :
return self.nom
A = Eleve('Adrien', 12, 13, 14)
B = Eleve('Brigitte', 13, 18, 5)
C = Eleve('Casimir', 9, 12, 14)
D = Eleve('Damien', 18, 20, 19)
groupe = [A, B, C, D]
groupe.sort(key= lambda el : el.moyenne)
print( groupe )
print( [el.moyenne for el in groupe] )
On obtient :
[Casimir, Brigitte, Adrien, Damien]
[11.666666666666666, 12.0, 13.0, 19.0]
On obtiendra le même résultat en utilisant le module operator
:
import operator
class Eleve :
def __init__(self, nom, *notes) :
self.nom = nom
self.notes =list(notes)
@property
def moyenne(self) :
return sum(self.notes)/len(self.notes)
def __repr__(self) :
return self.nom
A = Eleve('Adrien', 12, 13, 14)
B = Eleve('Brigitte', 13, 18, 5)
C = Eleve('Casimir', 9, 12, 14)
D = Eleve('Damien', 18, 20, 19)
groupe = [A, B, C, D]
groupe.sort(key=operator.attrgetter("moyenne"))
print( groupe )
print( [el.moyenne for el in groupe] )
On peut également ajouter un second critère de tri. Ci-dessous, on trie d'abord en
ordre croissant des moyennes, et pour une même moyenne en ordre croissant des âges.
import operator
class Eleve :
def __init__(self, nom, age, *notes) :
self.nom = nom
self.age = age
self.notes = list(notes)
@property
def moyenne(self) :
return sum(self.notes)/len(self.notes)
def __repr__(self) :
return repr((self.nom, self.moyenne, self.age))
A = Eleve('Adrien', 15, 12, 13, 14)
B = Eleve('Brigitte', 15, 13, 18, 5)
C = Eleve('Casimir', 14, 9, 12, 14)
D = Eleve('Damien', 16, 18, 20, 19)
E = Eleve('Emmanuel', 14, 14, 12, 13)
F = Eleve('Fabienne', 13, 13, 13, 13)
groupe = [A, B, C, D, E, F]
groupe.sort(key=operator.attrgetter("moyenne", "age"))
print( groupe )