Parcours
/
Python
Python
/
Exercices
/
Les montagnes russes colossales de Chaitana
Les montagnes russes colossales de Chaitana

Les montagnes russes colossales de Chaitana

Exercice d'apprentissage

Introduction

Une list est une collection modifiable d'éléments en séquence. Comme la plupart des collections (voir les types natifs tuple, dict et set), les tableaux peuvent référencer n'importe quel type (ou plusieurs types) de données, y compris d'autres tableaux. On peut copier un tableau en tout ou en partie grâce à la notation de tranche ou en utilisant <list>.copy(). Comme toute séquence, les éléments d'une list sont référencés par leur 0-based index depuis la gauche, ou leur -1-based index depuis la droite.

Les tableaux prennent en charge à la fois les opérations de séquence courantes et les opérations de séquence mutables, comme min(<list>)/max(<list>), <list>.index(), <list>.append() et <list>.reverse(). On peut parcourir les éléments d'une list avec la construction for item in <list>. On peut utiliser for index, item in enumerate(<list>) lorsqu'on a besoin à la fois de l'indice et de la valeur d'un élément.

Python fournit aussi de nombreuses méthodes de liste utiles pour travailler avec les tableaux. Une sélection de ces list methods est présentée ci-dessous.

Note que lorsqu'on manipule une list avec une list-method, on modifie l'objet tableau qui a été passé. Si on ne souhaite pas modifier la list d'origine, il faut au moins en faire une shallow copy via une tranche ou <list>.copy().

Ajoute des éléments

Pour ajouter un élément à la fin ou du « côté droit » d'un tableau existant, utilise <list>.append(<item>) :

>>> numbers = [1, 2, 3]
>>> numbers.append(9)

>>> numbers
[1, 2, 3, 9]

Plutôt que d'ajouter en fin de tableau, <list>.insert() permet d'insérer l'élément à un indice précis du tableau. Elle prend 2 paramètres :

  1. le <index> auquel on souhaite insérer l'élément ;
  2. le <item> à insérer.

Note : si l'index donné est 0, l'élément est ajouté au début (« côté gauche ») de la list. Si l'index fourni est supérieur au dernier index de la list, l'élément est ajouté à la dernière position, ce qui équivaut à utiliser <list>.append(<item>).

>>> numbers = [1, 2, 3]
>>> numbers.insert(0, -2)

>>> numbers
[-2, 1, 2, 3]

>>> numbers.insert(1, 0)

>>> numbers
[-2, 0, 1, 2, 3]

<list>.extend(<item>) permet de combiner un tableau existant avec les éléments d'un autre itérable (par exemple un set, un tuple, un str ou une list). L'itérable est dépaqueté et ses éléments sont ajoutés dans l'ordre (utiliser <list>.append(<item>) dans ce cas ajouterait l'itérable entier comme un seul élément.).

>>> numbers = [1, 2, 3]
>>> other_numbers = [5, 6, 7]

>>> numbers.extend(other_numbers)

>>> numbers
[1, 2, 3, 5, 6, 7]

>>> numbers.extend([8, 9])

>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9]

>>> numbers.append([8,9])

>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9, [8, 9]]

Supprime des éléments

Pour supprimer un élément d'un tableau, utilise <list>.remove(<item>) en passant l'élément à supprimer en argument. <list>.remove(<item>) lève une ValueError si l'élément n'est pas présent dans la list.

>>> numbers = [1, 2, 3]
>>> numbers.remove(2)

>>> numbers
[1, 3]

# Trying to remove a value that is not in the list throws a ValueError
>>> numbers.remove(0)
ValueError: list.remove(x): x not in list

Sinon, utiliser la méthode <list>.pop(<index>) permet à la fois de supprimer et de return un élément pour l'utiliser.

<list>.pop(<index>) prend un paramètre facultatif : l'index de l'élément à supprimer et à renvoyer. Si l'argument index (facultatif) n'est pas précisé, le dernier élément de la list est supprimé et renvoyé. Si l'index indiqué est supérieur à l'index du dernier élément, une IndexError est levée.

>>> numbers = [1, 2, 3]

>>> numbers.pop(0)
1

>>> numbers
[2, 3]

>>> numbers.pop()
3

>>> numbers
[2]

>>> numbers.pop(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: pop index out of range

On peut supprimer tous les éléments d'une list avec list.clear(). Elle ne prend aucun paramètre.

>>> numbers = [1, 2, 3]
>>> numbers.clear()

>>> numbers
[]

Inverse et réordonne

La méthode <list>.reverse() inverse l'ordre des éléments sur place.

>>> numbers = [1, 2, 3]
>>> numbers.reverse()

>>> numbers
[3, 2, 1]

On peut réordonner un tableau sur place grâce à <list>.sort(). L'ordre de tri par défaut est croissant en partant de la gauche. La documentation Python propose d'autres conseils et techniques de tri.

Note

De 2002 à 2022, Python utilisait en interne un algorithme appelé Timsort pour organiser les tableaux, mais est passé à Powersort à partir de Python 3.11.

>>> names = ["Tony", "Natasha", "Thor", "Bruce"]

# The default sort order is *ascending*.
>>> names.sort()

>>> names
["Bruce", "Natasha", "Thor", "Tony"]

Si on souhaite un ordre décroissant, passe l'argument reverse=True :

>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
>>> names.sort(reverse=True)

>>> names
["Tony", "Thor", "Natasha", "Bruce"]

Lorsqu'on ne souhaite pas modifier le tableau d'origine, on peut utiliser la fonction native sorted(<iterable>) pour renvoyer une copie triée.

>>> names = ["Tony", "Natasha", "Thor", "Bruce"]

>>> sorted(names)
['Bruce', 'Natasha', 'Thor', 'Tony']

Occurrences d'un élément dans un tableau

On peut calculer le nombre d'occurrences d'un élément dans un tableau à l'aide de list.count(<item>). Elle prend en argument l'item à compter et renvoie le nombre total de fois où cet élément apparaît dans la list.

>>> items = [1, 4, 7, 8, 2, 9, 2, 1, 1, 0, 4, 3]

>>> items.count(1)
3

Trouve l'indice des éléments

<list>.index(<item>) renvoie le numéro d'index de la première occurrence d'un élément passé en argument. S'il n'y a aucune occurrence, une ValueError est levée. Si la position exacte d'un élément n'est pas nécessaire, l'opérateur natif in est plus efficace pour vérifier qu'un tableau contient une valeur donnée.

L'indexation part de zéro à gauche, donc la position du « premier » élément est 0. L'indexation fonctionne aussi depuis la droite, en commençant par -1.

>>> items = [7, 4, 1, 0, 2, 5]

>>> items.index(4)
1

>>> items.index(10)
ValueError: 10 is not in list

On peut aussi fournir les indices start et end pour limiter la recherche à une section précise de la lists :

>>> names = ["Tina", "Leo", "Thomas", "Tina", "Emily", "Justin"]

>>> names.index("Tina")
0

>>> names.index("Tina", 2, 5)
3

Instructions

Chaitana possède un parc d'attractions très populaire. Elle n'a qu'une seule attraction, au cœur même d'un parc magnifiquement paysagé : The Biggest Roller Coaster in the World(TM). Bien qu'il n'y ait que cette seule attraction, des gens viennent des quatre coins du monde et font la queue pendant des heures pour avoir la chance de monter dans l'hypercoaster de Chaitana.

Il y a deux files d'attente pour cette attraction, chacune représentée par une list :

  1. File normale
  2. File express (aussi appelée Fast-track) : ici, on paie un supplément pour un accès prioritaire.

On t'a demandé d'écrire du code pour mieux gérer les visiteurs du parc. Tu dois implémenter les fonctions suivantes au plus vite, avant que les visiteurs (et ta patronne, Chaitana !) ne s'énervent. Prends bien soin de lire attentivement. Certaines tâches te demandent de modifier ou de mettre à jour la file d'attente existante, tandis que d'autres te demandent d'en faire une copie.

1. Ajoute-moi à la file d'attente

Définis la fonction add_me_to_the_queue() qui prend 4 paramètres <express_queue>, <normal_queue>, <ticket_type>, <person_name> et renvoie la file d'attente appropriée, mise à jour avec le nom de la personne.

  1. <ticket_type> est un int : 1 == express_queue et 0 == normal_queue.
  2. <person_name> est le nom (sous forme de str) de la personne à ajouter à la file d'attente correspondante.
>>> add_me_to_the_queue(express_queue=["Tony", "Bruce"], normal_queue=["RobotGuy", "WW"], ticket_type=1, person_name="RichieRich")
...
["Tony", "Bruce", "RichieRich"]

>>> add_me_to_the_queue(express_queue=["Tony", "Bruce"], normal_queue=["RobotGuy", "WW"], ticket_type=0, person_name="HawkEye")
....
["RobotGuy", "WW", "HawkEye"]

2. Où sont mes amis ?

Une personne est arrivée en retard au parc, mais elle veut rejoindre la file où ses amis attendent. Mais elle n'a aucune idée de l'endroit où ses amis se trouvent, et il n'y a pas de réseau pour les appeler.

Définis la fonction find_my_friend() qui prend 2 paramètres queue et friend_name et renvoie la position du nom de la personne dans la file d'attente.

  1. <queue> est la list des personnes qui font la queue.
  2. <friend_name> est le nom de l'ami dont tu dois trouver l'indice (sa place dans la file d'attente).

Rappel : l'indexation commence à 0 depuis la gauche, et à -1 depuis la droite.

>>> find_my_friend(queue=["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], friend_name="Steve")
...
1

3. Puis-je les rejoindre ?

Maintenant que leurs amis ont été trouvés (dans la tâche 2 ci-dessus), la personne arrivée en retard aimerait les rejoindre à leur place dans la file d'attente. Définis la fonction add_me_with_my_friends() qui prend 3 paramètres queue, index et person_name.

  1. <queue> est la list des personnes qui font la queue.
  2. <index> est la position à laquelle la nouvelle personne doit être ajoutée.
  3. <person_name> est le nom de la personne à ajouter à cette position.

Renvoie la file d'attente mise à jour avec le nom de la personne arrivée en retard.

>>> add_me_with_my_friends(queue=["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], index=1, person_name="Bucky")
...
["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]

4. Une personne méchante dans la file d'attente

Tu viens d'entendre dire, dans la file d'attente, qu'une personne vraiment méchante bouscule, crie et fait du grabuge. Tu dois expulser ce malotru pour son mauvais comportement !

Définis la fonction remove_the_mean_person() qui prend 2 paramètres queue et person_name.

  1. <queue> est la list des personnes qui font la queue.
  2. <person_name> est le nom de la personne à exclure.

Renvoie la file d'attente mise à jour, sans le nom de la personne méchante.

>>> remove_the_mean_person(queue=["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], person_name="Eltran")
...
["Natasha", "Steve", "Wanda", "Rocket"]

5. Les homonymes

Tu n'as peut-être jamais vu deux personnes sans lien de parenté qui se ressemblent trait pour trait, mais tu as assurément déjà vu des inconnus porter exactement le même nom (des homonymes) ! Aujourd'hui, il semble bien qu'il y en ait beaucoup parmi les visiteurs. Tu veux savoir combien de fois un nom donné apparaît dans la file d'attente.

Définis la fonction how_many_namefellows() qui prend 2 paramètres queue et person_name.

  1. <queue> est la list des personnes qui font la queue.
  2. <person_name> est le nom qui, selon toi, pourrait apparaître plus d'une fois dans la file d'attente.

Renvoie le nombre d'occurrences de person_name, sous forme d'int.

>>> how_many_namefellows(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"], person_name="Natasha")
...
2

6. Retire la dernière personne

Malheureusement, le parc est bondé aujourd'hui et tu dois retirer la dernière personne de la file normale (tu lui donneras un bon pour revenir en fast-track un autre jour). Tu devras définir la fonction remove_the_last_person() qui prend 1 paramètre queue, la liste des personnes qui font la queue.

Tu dois mettre à jour la list et aussi return le nom de la personne retirée, afin de pouvoir lui rédiger un bon.

>>> remove_the_last_person(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
'Rocket'

7. Trie la liste de la file d'attente

Pour des raisons administratives, tu dois obtenir tous les noms d'une file d'attente donnée par ordre alphabétique.

Définis la fonction sorted_names() qui prend 1 argument, queue, (la list des personnes qui font la queue), et renvoie une copie sorted de la list.

>>> sorted_names(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Python Exercism

Prêt à commencer Les montagnes russes colossales de Chaitana ?

Inscris-toi sur Exercism pour apprendre et maîtriser Python avec 17 concepts146 exercices, et un vrai mentorat humain, le tout gratuitement.