Formation I.S.N.

Trier suivant un critère

Ordre alphabétique.

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']

Ordonner par les notes de contrôle.

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]]

ordonner par la dernière note de contrôle.

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.

  • avec sorted
  • avec sort

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) 

ordonner par la moyenne.

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) 

ordonner par l'amplitude.

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) )

Compléments Python.

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 )