Une course☘
Après une course, on dispose d'un tuple constitué de tuples. Chaque tuple est de la forme (numéro de dossard, nom, prénom, (heure, minute, seconde)) où le tuple (heure, minute, seconde) correspond au temps mis par ce candidat pour finir la course.
Par exemple:
une_course = ( (1, 'Labrosse', 'Adam', (3,45, 23)),
(2, 'Gemlamorte', 'Adèle', (4, 12, 29)),
(4, 'Etpan', 'Ahmed', (3, 32, 43)),
(5, 'Térieur', 'Alain', (4, 21, 55)),
(3, 'Auboisdormant', 'Abel', (2, 5, 12)),
(7, 'Tanrien', 'Jean', (3, 42, 10)),
(8, 'Ouzi', 'Jacques', (3, 32, 9)),
(9, 'Deuf', 'John', (5, 40, 7)),
(10, 'Provist', 'Alain', (3,45, 33)),
(6, 'Térieur', 'Alex', (2, 34, 49))
)
Comprendre l'objet ci-dessus☘
Question☘
Quelle est la valeur de une_course[1]
?
Solution
Il s'agit de l'élément d'indice 1 du tuple une_course
.
Cet élément d'indice 1 est lui-même un tuple:
(2, 'Gemlamorte', 'Adèle', (4, 12, 29))
Question☘
Comment récupérer le numéro de dossard
et le nom du coureur ayant l'indice 2 dans le tuple une_course
?
Solution
On récupère le coureur concerné:
>>> coureur = une_course[2]
>>> coureur
(4, 'Etpan', 'Ahmed', (3, 32, 43))
On peut ensuite par exemple définir le couple (numéro de dossard, nom) de ce coureur comme suit:
>>> dossard, nom = coureur[0], coureur[1]
>>> dossard, nom
(4, 'Etpan')
On peut procéder en une seule étape:
>>> dossard, nom = (une_course[2][0], une_course[2][1])
>>> dossard, nom
(4, 'Etpan')
Question☘
Comment récupérer la partie "minutes" du temps mis par le coureur d'indice 0
dans le tuple une_course
?
Solution
On récupère d'abord le tuple d'indice 0:
>>> t = une_course[0]
(1, 'Labrosse', 'Adam', (3, 45, 23))
Ensuite on récupère dans ce tuple t
le triplet correspondant au temps:
>>> t = une_course[0]
>>> temps = t[3]
>>> temps
(3, 45, 23)
On peut maintenant récupérer la partie minutes:
>>> t = une_course[0]
>>> temps = t[3]
>>> minutes = temps[1]
>>> minutes
45
On peut bien sûr procéder en une seule étape:
>>> une_course[0][3][1]
45
Question☘
Comment récupérer le nom du coureur ayant le dossard 3 dans une_course
?
Solution
Cette fois, le coureur est identifié par son dossard et non par son indice
dans le tuple. On n'a donc pas d'accès direct.
On va donc parcourir le tuple une_course
jusqu'à "tomber" sur le coureur
de dossard 3 et on récupèrera alors son nom.
for c in une_course:
if c[0] == 3:
coureur = c
nom = coureur[1]
On vérifie alors que la variable nom désigne la valeur 'Auboisdormant' (en l'affichant par exemple).
Des longueurs☘
Quelles sont les valeurs de len(une_course)
, de len(une_course[0])
, de len(une_course[0][1])
,
de len(une_course[0][3])
?
Solution
len(une_course)
est le nombre d'éléments dans le tupleune_course
, il y en a 10.len(une_course[0])
est la longueur du tuple(1, 'Labrosse', 'Adam', (3,45, 23))
, c'est à dire 4.len(une_course[0][1])
est la longueur de la chaîne'Labrosse'
, c'est à dire 8.len(une_course[0][3])
est la longueur du tuple(3,45, 23)
, c'est à dire 3.
Obtenir le temps en seconde☘
Ecrire un corps possible pour la fonction suivante:
def temps_en_seconde(course, dossard):
"""
course: un tuple tel que le précédent, résultant d'une course.
dossard: un numéro de dossard
renvoie le temps en seconde réalisé par le coureur portant ce dossard
"""
Solution
def temps_en_seconde(course, dossard):
"""
course: un tuple tel que le précédent, résultant d'une course.
dossard: un numéro de dossard
renvoie le temps en seconde réalisé par le coureur portant ce dossard
"""
for coureur in course:
if coureur[0] == dossard:
heures = coureur[3][0]
minutes = coureur[3][1]
secondes = coureur[3][2]
return heures*3600 + minutes*60 + secondes
Liste des noms avec temps en seconde☘
Ecrire un corps possible pour la fonction ci-dessous:
def liste_temps(course):
"""
course: un tuple tel que le précédent, résultant d'une course.
renvoie un tuple contenant
les triplets (nom, prénom, temps en seconde)
"""
Solution
def liste_temps(course):
"""
course: un tuple tel que le précédent, résultant d'une course.
renvoie un tuple contenant les triplets (nom, prénom, temps en seconde)
"""
resultat = tuple()
for coureur in course:
ajout = (coureur[1], coureur[2], temps_en_seconde(course, coureur[0]))
resultat += (ajout, )
return resultat
Essai avec la course donnée en début de page:
liste_temps(une_course)
donne
(('Labrosse', 'Adam', 13523),
('Gemlamorte', 'Adèle', 15149),
('Etpan', 'Ahmed', 12763),
('Térieur', 'Alain', 15715),
('Auboisdormant', 'Abel', 7512),
('Tanrien', 'Jean', 13330),
('Ouzi', 'Jacques', 12729),
('Deuf', 'John', 20407),
('Provist', 'Alain', 13533),
('Térieur', 'Alex', 9289))
En compréhension
En définissant le tuple demandé en compréhension:
def liste_temps_comp(course):
"""
course: un tuple tel que le précédent, résultant d'une course.
renvoie un tuple contenant les triplets (nom, prénom, temps en seconde)
"""
return tuple((coureur[1], coureur[2], temps_en_seconde(course, coureur[0])) for coureur in course)
Gagnant☘
Ecrire un corps possible pour la fonction ci-dessous:
def gagnant(course):
"""
course: un tuple tel que le précédent, résultant d'une course.
renvoie le triplet (dossard, nom, prénom)
du coureur ayant fait le meilleur temps.
"""
Fonction de test:
def test_gagnant():
une_course = ( (1, 'Labrosse', 'Adam', (3,45, 23)),
(2, 'Gemlamorte', 'Adèle', (4, 12, 29)),
(4, 'Etpan', 'Ahmed', (3, 32, 43)),
(5, 'Térieur', 'Alain', (4, 21, 55)),
(3, 'Auboisdormant', 'Abel', (2, 5, 12)),
(7, 'Tanrien', 'Jean', (3, 42, 10)),
(8, 'Ouzi', 'Jacques', (3, 32, 9)),
(9, 'Deuf', 'John', (5, 40, 7)),
(10, 'Provist', 'Alain', (3,45, 33)),
(6, 'Térieur', 'Alex', (2, 34, 49))
)
assert gagnant(une_course) == (3, 'Auboisdormant', 'Abel')
Solution
def gagnant(course):
"""
course: un tuple tel que le précédent, résultant d'une course.
renvoie le triplet (dossard, nom, prénom) du coureur ayant fait le meilleur temps.
"""
meilleur_coureur = course[0]
meilleur_temps = temps_en_seconde(course, meilleur_coureur[0])
for coureur in course:
if temps_en_seconde(course, coureur[0]) < meilleur_temps:
meilleur_coureur = coureur
meilleur_temps = temps_en_seconde(course, meilleur_coureur[0])
return (meilleur_coureur[0], meilleur_coureur[1], meilleur_coureur[2])
Test sur la course de début de page:
gagnant(une_course)
donne:
(3, 'Auboisdormant', 'Abel')
Sélection☘
La course permettait de sélectionner les coureurs pour un championnat. Les coureurs sélectionnés sont les coureurs ayant réalisé un temps d'au plus 3h40.
Ecrire un corps possible pour la fonction ci-dessous:
def selectionner(course):
"""
course: un tuple tel que le précédent, résultant d'une course.
renvoie le tuple
constitué des uplets (nom, prénom, triplet temps)
des coureurs sélectionnés.
"""
Fonction de test:
def test_selectionner():
une_course = ( (1, 'Labrosse', 'Adam', (3,45, 23)),
(2, 'Gemlamorte', 'Adèle', (4, 12, 29)),
(4, 'Etpan', 'Ahmed', (3, 32, 43)),
(5, 'Térieur', 'Alain', (4, 21, 55)),
(3, 'Auboisdormant', 'Abel', (2, 5, 12)),
(7, 'Tanrien', 'Jean', (3, 42, 10)),
(8, 'Ouzi', 'Jacques', (3, 32, 9)),
(9, 'Deuf', 'John', (5, 40, 7)),
(10, 'Provist', 'Alain', (3,45, 33)),
(6, 'Térieur', 'Alex', (2, 34, 49))
)
assert selectionner(une_course) == (('Etpan', 'Ahmed', (3, 32, 43)),
('Auboisdormant', 'Abel', (2, 5, 12)),
('Ouzi', 'Jacques', (3, 32, 9)),
('Térieur', 'Alex', (2, 34, 49)))
Solution
def selectionner(course):
"""
course: un tuple tel que le précédent, résultant d'une course.
renvoie le tuple
constitué des uplets (nom, prénom, triplet temps)
des coureurs sélectionnés.
"""
couperet = 3*3600 + 40*60
selection = tuple()
for coureur in course:
temps = temps_en_seconde(course, coureur[0])
if temps <= couperet:
ajout = (coureur[1], coureur[2], coureur[3])
selection += (ajout, )
return selection
Test avec la course de début de page:
selectionner(une_course)
donne:
(('Etpan', 'Ahmed', (3, 32, 43)),
('Auboisdormant', 'Abel', (2, 5, 12)),
('Ouzi', 'Jacques', (3, 32, 9)),
('Térieur', 'Alex', (2, 34, 49)))
En compréhension
def selectionner_comp(course):
"""
course: un tuple tel que le précédent, résultant d'une course.
renvoie le tuple
constitué des uplets (nom, prénom, triplet temps)
des coureurs sélectionnés.
"""
couperet = 3*3600 + 40*60
return tuple((c[1], c[2], c[3]) for c in course if temps_en_seconde(course, c[0]) <= couperet)
Même prénom☘
Ecrire un corps possible pour la fonction:
def meme_prenom(course, prenom):
"""
renvoie le tuple constitué
des triplets (nom, prénom, dossard)
des coureurs ayant pour prénom prenom.
"""
Solution
def meme_prenom(course, prenom):
"""
renvoie le tuple constitué
des triplets (nom, prénom, dossard)
des coureurs ayant pour prénom prenom.
"""
resultat = tuple()
for c in course:
if c[2] == prenom:
ajout = (c[1], c[2], c[0])
resultat += (ajout,)
return resultat
>>> meme_prenom(une_course, "Alain")
(('Térieur', 'Alain', 5), ('Provist', 'Alain', 10))
En compréhension
En définissant le tuple demandé en compréhension:
def meme_prenom_comp(course, prenom):
"""
renvoie le tuple constitué
des triplets (nom, prénom, dossard)
des coureurs ayant pour prénom prenom.
"""
return tuple((c[1], c[2], c[0]) for c in course if c[2] == prenom)
L'ensemble☘
Vous trouverez l'ensemble des fonctions de cette page dans cette feuille ipynb (à ouvrir, rappelons le, avec jupyter notebook ou en ligne avec le notebook basthon).