Aller au contenu

Trier une liste de tuples, bis

On dispose d'une liste de tuples de la forme (dossard, nom, prénom, année de naissance, (heure, minute, seconde)) où le temps correspond au temps réalisé lors d'une course.

coureurs = personnes = [ (1, 'Labrosse', 'Adam', 2000, (3,42,12)), 
(8,'Gemlamorte', 'Adèle', 1985, (4,10,2)), 
(9,'Auboisdormant', 'Abel', 2001,(3,50,3)),
(2,'Etpan', 'Ahmed', 1975, (4,10,2)), 
(7,'Térieur', 'Alain', 1999, (3,42,12)), 
(10,'Térieur', 'Alex', 1976, (3,42,12)), 
(6,'Tanrien', 'Jean', 2010, (3,50,3)),
(3,'Ouzi', 'Jacques', 1950, (3,42,12)),
(14,'Gator','Ali',2001, (5,2, 1)), 
(5,'Deuf', 'John', 2006, (3,0,12)),
(4,'Provist', 'Alain', 2011, (3,50,3)),
(12,  'Verserre','Annie',2001,(5,2, 1) ),
(11,'Dajeun','Bruno',1984, (5,2, 1)),
(13,'Ainé','Ali',1975, (3,4,0)),
(15, 'Verse','Alain',1970, (5,2, 1)),
(16,'Ception','Alex',2001, (3, 16, 34))
]

Tri suivant les noms

Trier la liste suivant les noms des coureurs.

Solution
def get_nom(coureur):
    """
    coureur  est un tuple (dossard, nom, prénom, année de naissance, (heure, minute, seconde)) 
    renvoie le nom
    """
    return coureur[1]



def tri_suivant_nom(tab):
    """
    tab: une liste de coureurs
    trie la liste suivant l'ordre croissant alphabétique des noms
    """
    tab.sort(key=get_nom)

Utilisation:

coureurs = personnes = [ (1, 'Labrosse', 'Adam', 2000, (3,42,12)), 
(8,'Gemlamorte', 'Adèle', 1985, (4,10,2)), 
(9,'Auboisdormant', 'Abel', 2001,(3,50,3)),
(2,'Etpan', 'Ahmed', 1975, (4,10,2)), 
(7,'Térieur', 'Alain', 1999, (3,42,12)), 
(10,'Térieur', 'Alex', 1976, (3,42,12)), 
(6,'Tanrien', 'Jean', 2010, (3,50,3)),
(3,'Ouzi', 'Jacques', 1950, (3,42,12)),
(14,'Gator','Ali',2001, (5,2, 1)), 
(5,'Deuf', 'John', 2006, (3,0,12)),
(4,'Provist', 'Alain', 2011, (3,50,3)),
(12,  'Verserre','Annie',2001,(5,2, 1) ),
(11,'Dajeun','Bruno',1984, (5,2, 1)),
(13,'Ainé','Ali',1975, (3,4,0)),
(15, 'Verse','Alain',1970, (5,2, 1)),
(16,'Ception','Alex',2001, (3, 16, 34))
]
tri_suivant_nom(coureurs)

Tri suivant les prénoms

Trier la liste suivant les prénoms (ordre croissant). Et des personnes ayant le même prénom apparaîtront dans l'ordre décroissant de leur numéro de dossard.

Solution
def get_prenom(coureur):
    """
    coureur  est un tuple (dossard, nom, prénom, année de naissance, (heure, minute, seconde)) 
    renvoie le nom
    """
    return coureur[2]

def get_dossard(coureur):
    """
    coureur  est un tuple (dossard, nom, prénom, année de naissance, (heure, minute, seconde)) 
    renvoie le dossard
    """
    return coureur[0]

def tri(tab):
    """
    tab: une liste de coureurs
    trie la liste suivant prénoms. A mêmes prénoms, tri suivant dossard décroissant.
    """
    tab.sort(key=get_dossard, reverse=True)
    tab.sort(key=get_prenom)

Tri suivant le temps

Trier la liste dans l'ordre croissant des temps réalisés. Des personnes ayant réalisé le même temps seront triées dans l'ordre décroissant des âges.

Solution
def get_temps(coureur):
    """
    coureur  est un tuple (dossard, nom, prénom, année de naissance, (heure, minute, seconde)) 
    renvoie le temps réalisé en seconde
    """
    temps = coureur[4]
    return temps[0]*3600 +  temps[1]*60 + temps[2]

def get_annee_naissance(coureur):
    """
    coureur  est un tuple (dossard, nom, prénom, année de naissance, (heure, minute, seconde)) 
    renvoie l
    """

    return coureur[3]

def tri(tab):
    """
    tab: une liste de coureurs
    trie la liste suivant temps. A mêmes temps, tri suivant âge décroissant.
    """
    # ordre croissant des années de naissance = ordre décroissant des âges:
    tab.sort(key=get_annee_naissance)
    # ordre croissant des temps:
    tab.sort(key=get_temps)