<jupyter_start><jupyter_text>TP 14 - Recherche dans une collectionPour chaque exercice, rentrez votre réponse dans l'éditeur Python associé.Enregistrez vos modifications, de préférence au format ipynb, lorsque vous aurez terminé.  Exercice 1 - Vérification qu'une liste est triéeImplémentez la fonction `est_triee` qui prend en entrée une liste et retourne `True` si elle est triée dans l'ordre croissant.Par exemple :```pyprint(est_triee([1, 2, 3]))print(est_triee([4, 2, 3]))```doit afficher :```TrueFalse```<jupyter_code><jupyter_output><empty_output><jupyter_text>Exercice 2 - Amélioration de la fonction est_trieeImplémentez la fonction `est_triee_comp` qui prend en entrée une liste et une fonction de comparaison, et retourne `True` si la fonction de comparaison renvoie `True` pour chaque élément pris 2 à 2.Par exemple :```pysuperieur = lambda a, b: a > best_decroissant = lambda L: est_triee_comp(L, superieur)L = [5, 4, 3, 2, 1]statut = est_decroissant(L)print(statut)```doit afficher :```True```<jupyter_code><jupyter_output><empty_output><jupyter_text>Exercice 3 - Recherche binaire dans une liste triéeImplémentez la fonction `recherche_binaire` qui prend une liste, une fonction de comparaison et un nombre en entrée, et renvoie l'index de ce nombre, s'il est dans la liste, et -1 sinon.Si la liste en entrée n'est pas triée, levez une exception.Par exemple :```pysuperieur = lambda a, b : a > bL = [10, 5, 3, 1]try:    index = recherche_binaire(L, superieur, 3)    print(index)    index = recherche_binaire(L, superieur, 2)    print(index)    index = recherche_binaire([1, 2, 3], superieur, 2)    print(index)except ValueError:    print("Exception attrapée")```doit afficher :```2-1Exception attrapée```<jupyter_code><jupyter_output><empty_output><jupyter_text>Exercice 4 - Collection toujours triéeEn utilisant le mot clé `class` et l'annotation `@dataclass`, créez une structure de données appelée `ListeTriee`.Cette structure de données comporte :* une donnée membre appelée `liste`, et initialisée à une liste vide.* une donnée membre appelée `comparateur`, et initialisée à une lambda qui renvoie `True` si un premier nombre est inférieur au second.<jupyter_code>from dataclasses import dataclass, field
from typing import List, Callable

@dataclass
class ListeTriee:
    """Cette liste est toujours triée par construction."""
    liste: List = field(default_factory=list)
    comparateur: Callable[[int, int], bool] = lambda a, b: a < b

# Exemple de création
liste_triee = ListeTriee()

# La variable liste est une list Python
liste_triee.liste.append(2)

# On peut facilement l'afficher
print(liste_triee.liste)

# Le comparateur est une fonction lambda que l'on peut appeler
print(liste_triee.comparateur(2, 3))<jupyter_output>[2]
True<jupyter_text>Implémentez la fonction `affiche_liste_triee` qui prend une `ListeTriee` en entrée et affiche son contenu sur la sortie standard de la console.<jupyter_code><jupyter_output><empty_output><jupyter_text>Implémentez la fonction `insertion_triee` qui prend une `ListeTriee` nommée `L` et un nombre nommé `n` en entrée. Le nombre `n` est inséré dans la liste dès que le comparateur renvoie `True`.Par exemple :```pyL = ListeTriee()insertion_triee(L, 5)insertion_triee(L, 3)insertion_triee(L, 8)insertion_triee(L, 1)insertion_triee(L, 2)insertion_triee(L, 10)affiche_liste_triee(L)```doit afficher :```[1, 2, 3, 5, 8, 10]```Autre exemple :```pyL = ListeTriee(comparateur=lambda a, b : a > b)insertion_triee(L, 5)insertion_triee(L, 3)insertion_triee(L, 8)insertion_triee(L, 1)insertion_triee(L, 2)insertion_triee(L, 10)affiche_liste_triee(L)```doit afficher :```[10, 8, 5, 3, 2, 1]```<jupyter_code><jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10635994587280108, 'fraction_numerical': 0.017591339648173207, 'mean_word_length': 6.496957403651115, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 27, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '553944', 'license': 'MIT', 'n_tokens_mistral': 1382, 'n_tokens_neox': 1354, 'n_words': 400, 'path': 'cours/09-recherche-et-tri/work-assignment-18.ipynb', 'repo_name': 'loic-yvonnet/algo-appliquee', 'size': '3695'}