Le maximum suivant une colonne☘
Note
Plus tard, on effectuera de même un tri suivant une colonne. On pourra avoir besoin du travail réalisé ici pour programmer ces tris.
Exercice 1☘
On dispose de listes de p-uplets d'entiers, p fixé.
Par exemple:
1 | L = [ (12, 13, 16), (7, 8, 5), (17,15, 19), (20, 14, 19)] |
Ces listes correspondent par exemple à des notes d'élèves.
Question 1☘
En s'inspirant des exercices de cette page, donner le code d'une fonction prenant en paramètre une telle liste et donnant en sortie le tuple maximal, un tuple étant plus grand qu'un autre lorsque la première composante (la première note) est plus grande.
Un code possible
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | def max_binaire(a,b): """ a et b sont des tuples. La fonction renvoie a si a[0] > b[0] et renvoie b sinon. """ if a[0] > b[0]: return a else: return b def extreme_tableau(tab, extreme_binaire): """ tab est une liste d'éléments "comparables". La fonction renvoie un élément extremum. """ m = tab[0] for x in tab: m = extreme_binaire(m,x) return m def max_tableau_critere1(tab): return extreme_tableau(tab, max_binaire) # utilisation t = [ (15, 14, 12), (18, 12, 10), (17, 18, 20), (3, 13, 9)] m = max_tableau_critere1(t) print(m) |
Question 2☘
La définition de "plus grande valeur" dans la question 1 est-elle satisfaisante? Expliquer en quoi elle peut sembler ambigüe dans certains cas.
Une ambiguïté
On ne sait pas comment "comparer" deux triplets présentant la même première valeur. Par exemple, a = (18, 17, 16) et b = (18, 12, 14).
On peut par exemple décider de définir a < b par
Si a[0] < b[0] alors a < b. Si a[0] = b[0] et a[1] < b[1] alors a < b.
Dans ce cas, on ne pourra toujours pas comparer deux triplets dont les deux premières composantes sont indentiques. On peut décider de poursuivre la définition précédente:
Si a[0] < b[0] alors a < b. Si a[0] = b[0] et a[1] < b[1] alors a < b. Si a[0] = b[0] et a[1] = b[1] et a[2] < b[2] alors a < b.
Mais on pourrait aussi décider du critère suivant:
Si a[0] < b[0] alors a < b. Si a[0] = b[0] et a[1] < b[1] alors a < b. Si a[0] = b[0] et a[1] = b[1] et a[2] > b[2] alors a < b.
Dans certaines situations, le seul critère "Si a[0] < b[0] alors a < b" suffit, et on considère comme équivalents deux triplets tels que a[0] = b[0], même si les autres composantes sont distinctes. Par exemple on peut imaginer que deux coureurs se trouvent, lors d'une compétition, dans les quarts de finale, les demi-finales et la finale et arrivent tous deux en tête à la finale avec les temps (finale, demi-finale, quart de finale): (9, 11, 10) et (9, 12, 12), ils seront tous deux déclarés vainqueurs.