# Exécutez cette cellule !
from IPython.core.display import HTML

styles = "<style>\n.travail {\n    background-size: 30px;\n    background-image: url('https://cdn.pixabay.com/photo/2018/01/04/16/53/building-3061124_960_720.png');\n    background-position: left top;\n    background-repeat: no-repeat;\n    padding-left: 40px;\n}\n\n.bilan {\n    background-size: 30px;\n    background-image: url('https://cdn.pixabay.com/photo/2016/10/18/19/40/anatomy-1751201_960_720.png');\n    background-position: left top;\n    background-repeat: no-repeat;\n    padding-left: 40px;\n}\n</style>"
HTML(styles)

"""
Explanation: <img src="https://live.staticflickr.com/91/231524220_027b7431a1_b_d.jpg" width=70% >
SAÉ 03 - TP3 - Listes, indices, valeurs
Bienvenue sur le Jupyter pour préparer la SAÉ Traitement numérique du signal du département RT de Vélizy. Les notebooks sont une adaptation de ceux proposés par le département info et de leur profs d'info géniaux.
Ce TP est consacré au type list de python.
End of explanation
"""


maliste1 = [3, 5.2, "hop"]
type(maliste1)

"""
Explanation: Définition
Une liste, ou list, est un type conteneur, c'est à dire qui contient des valeurs ou des objets. 
Un objet du type list se définit comme une liste d'éléments séparés par des virgules, entre crochets.
End of explanation
"""


maliste1 = None


"""
Explanation: Une liste peut contenir tous types d'objets comme dans l'exemple ci-dessus où maliste1 contient trois éléments, dans l'ordre un int (entier), un float (flottant) et un str (chaîne de caractères).
<div class="alert alert-block alert-danger travail">

**Ex1.0 - une petite liste**  
Créez un objet nommé `maliste2` contenant 5 éléménts du type `int`, `int`, `float`, `bool`, `str`, puis affichez-le
</div>

Longueur d'une liste
<div class="alert alert-block alert-info bilan">

La **longueur d'une liste** est ... 

La plus petite longueur possible pour une liste est... 
</div>

La longueur d'une liste est obtenue par la fonction native len. 
<div class="alert alert-block alert-info bilan">

`len` est l'abbréviation du mot anglais ...

</div>

<div class="alert alert-block alert-danger travail">

**Ex1.1 - Range ta chambre**   
Affichez la longueur de `maliste1` (définie au tout début de cette feuille).  
Puis faites le nécessaire pour que `maliste1` devienne une liste vide, et affichez à nouveau sa longueur.
</div>

<div class="alert alert-block alert-danger travail">

**Ex1.2 - None**   
Et si vous affectez `None` à votre liste...est-ce toujours une liste?
</div>
End of explanation
"""


maliste1 = [3, 5.2, "hop"]

"""
Explanation: le mot-clé [] décrit un objet un peu particulier: la liste vide.  
le mot-clé None décrit un objet un peu particulier: l'objet vide.  

<div class="alert alert-block alert-danger travail">

**Ex1.3 - Les objets particuliers**   
Question importante: on se demande quelle est la différence entre `None`, `[]`, `False` et `0`.  
En particulier, on se demande comment réagit `if` quand on lui soumet ces objets: est-ce que `if []` est vrai ou faux?    
*(Nous avons vu précédement que, pour les entiers, un entier nul était considéré comme Faux, et tous les autres entiers comme Vrai.)*  
Procédez à quelques tests à l'aide du `if` afin de déterminer comment `None`, `[]` et `False` sont évalués. Affichez également leur type.  
Enfin, expliquez quelle est la différence, pour une liste `l`, entre écrire `l=[]` et `l=None`.
</div>

<div class="alert alert-block alert-info bilan"> 

`False` est de type.....et est évidemment évalué comme étant Faux.   
`None` est de type.....et est évalué comme étant.....   
`[]` est de type.....et est évalué comme étant...  

</div>

<div class="alert alert-block alert-danger travail">

**Ex1.4 - liste au choix**   
Créez une liste de longueur 8 et affichez sa longueur.

<img src="https://cdn.pixabay.com/photo/2018/09/26/09/13/pixel-cells-3704046_960_720.png" width=15% align=left> 

## Indices dans une liste

Les éléments d'une liste sont toujours numérotés dans l'ordre de la liste **en débutant à 0** et de 1 en 1. On appelle ce numéro **indice**. Les indices sont donc, dans l'ordre **0, 1, 2, 3, 4, 5, 6, 7...**
End of explanation
"""


maliste1[0]

maliste1[1]

maliste1[2]

maliste1[3]

"""
Explanation: L'élément 3 est à l'indice 0, l'élément 5.2 à l'indice 1 et l'élément 'hop' à l'indice 2.
On peut afficher la valeur d'un élément à un indice avec la syntaxe  
nomdelaliste[indice]
End of explanation
"""


maliste1[1] = "nouveau"

maliste1

"""
Explanation: <div class="alert alert-block alert-info bilan">

Le message d'erreur `list index out of range` signifie que ...
</div>

<div class="alert alert-block alert-info bilan">

Le plus grand indice possible pour une liste qui aurait une longueur 200 est ...
</div>

(Vérifiez le nombre possible d'indice)
Les listes sont mutables ce qui signifie qu'on peut les transformer et changer leurs valeurs sans modifier l'identité (obtenue avec id) de la liste concernée. On peut changer un élément qui se trouve dans une liste simplement par une affectation.
End of explanation
"""


maliste1

maliste1.append('42')

"""
Explanation: <div class="alert alert-block alert-danger travail">

**Exo 1.5** Créez une liste `maliste3` contenant les entiers de 3 à 8. Puis, un par un changez ces éléments en 10, 11, ..., 15
</div>

Ajouter des éléments dans une liste
On peut ajouter de nouveaux éléments à la suite d'une liste déjà existante
C'est une modification de la liste (les listes sont mutables).
La syntaxe pour ajouter à la fin est
nomdelaliste.append(element_a_ajouter)
End of explanation
"""


maliste1

print(len(maliste1))

"""
Explanation: notez que rien ne s'affiche car la méthode append ne renvoie rien
End of explanation
"""


l = [7,4]
if l[0] > l[1]:
    maxi = l[0]
else:
    maxi = l[1]
print("Le maximum de la liste vaut", maxi)

"""
Explanation: <div class="alert alert-block alert-info bilan">

**append**  signifie en anglais ...
</div>

Exercices
La fonction native max
<div class="alert alert-block alert-danger travail">

**Exo 2.0** 
Il existe une fonction native `max` qui donne la valeur maximum dans une liste (quand cela a un sens). Écrivez un exemple ci-dessous.
</div>

Pour les exercices suivants le but est de ne PAS utiliser la fonction max !
Écris "compris" si tu as compris :
Maximum dans une liste de longueur 2 (exemple)
Le code ci-dessous fonctionne quels que soient les deux nombres dans une liste de longueur 2. Vérifiez en changeant les valeurs !
End of explanation
"""


l = [7, 4, 12, 5]
# à compléter


print("Le maximum de la liste vaut", maxi)

"""
Explanation: Maximum dans une liste de longueur 4
<div class="alert alert-block alert-danger travail">

**Exo 2.1** 
Complétez le code ci-dessous. A la fin de son exécution, la variable maxi doit contenir le maximum des 4 valeurs de la liste.

**Attention :** le code doit fonctionner quelles que soient les valeurs de la liste !
</div>
End of explanation
"""


l = [3, 5, 1, 5]
# à compléter


print("L'indice du maximum de la liste est", imaxi)

"""
Explanation: Indice du maximum dans une liste de longueur 4
<div class="alert alert-block alert-danger travail">

**Exo 2.2** 
Cette fois-ci, votre code doit donner l'indice qui correspond au maximum de la liste de longueur 4. Si le maximum apparaît plusieurs fois, vous devez afficher à la fin le  premier indice possible.
Par exemple, si la liste est `[3, 5, 1, 5]` l'indice affiché devra être 1.
Bien entendu, le code doit fonctionner si l'on change les 4 valeurs !
</div>
End of explanation
"""


l = [10, 11, 12, 16, 14, 15, 13, 17]
# a completer

"""
Explanation: Échanger deux valeurs dans une liste
<div class="alert alert-block alert-danger travail">

**Exo 2.3** 
Cette liste est mal rangée. Echangez les valeurs se trouvant aux indices 3 et 6. Idéalement, cet échange devrait fonctionner même si on changeait la liste. Vous aurez peut-être besoin d'une variable "tampon" (ou de stockage temporaire) ?
</div>
End of explanation
"""


# exemple
l = [12, 5]
if l[1] < l[0]:
    # complétez : échangez les éléments d'indices 0 et 1
    
print(l)

# idem pour listes de longueur 3
l = [12, 15, 2]

# À compléter...

print(l)

"""
Explanation: Tri d'une liste de longueur 3
<div class="alert alert-block alert-danger travail">

**Exo 2.4** 
On donne une liste de longueur 3. On demande de la trier en ordre croissant en procédant par comparaisons et échanges successifs. En exemple, on vous montre comment le faire pour une liste de longueur 2 (mais il vous faut compléter les échanges)
</div>
End of explanation
"""


# comme vous êtes en forme vous pouvez peut-être tenter le cas longueur 4 ?
l = [12, 2, 6, 4]

print(l)

"""
Explanation: Pour vérifier, essayez différents ordres possibles pour la liste de départ.
End of explanation
"""


