T1.c Listes en compréhension

Listes en compréhension

Une manière originale et très puissante de générer des listes est d'utiliser une liste en compréhension (ou la compréhension de listes). Pour plus de détails, consultez à ce sujet le site de Python et celui de Wikipédia.

Voici quelques exemples.

Nombres pairs compris entre 0 et 30

Exemple : comprégension avec un if

Jeu sur la casse des mots d'une phrase

Exemple : utiliser split, puis upper

Formatage d'une séquence avec 60 caractères par ligne

Exemple d'une séquence constituée de 150 alanines :

Exemple : Formater un chaine

T1.b copier des listes : ATTENTION


Copier une liste


Cette section est particulièrement importante et doit être bien comprise

Exemple : Copier une liste ? ATTENTION !

Vous voyez que la modification de x modifie y aussi ! 
Dans python tutor ( cliquer sur visualiser pour acceder à python tutor) vous pouvez voir que x=y n'a pas dupliqué la liste.

Techniquement, Python utilise des pointeurs (comme dans le langage de programmation C) vers les mêmes objets. Python Tutor l'illustre avec des flèches qui partent des variables x et y et qui pointent vers la même liste. Donc, si on modifie la liste x, la liste y est modifiée de la même manière. Rappelez-vous de ceci dans vos futurs programmes car cela pourrait avoir des effets désastreux !

Pour éviter ce problème, il va falloir créer une copie explicite de la liste initiale. Observez cet exemple :

Exemple : Copier une liste ? ATTENTION !

Si on regarde à nouveau dans Python Tutor (Figure 12), on voit clairement que l'utilisation d'une tranche [:] ou de la fonction list() crée des copies explicites. Chaque flèche pointe vers une liste différente, indépendante des autres

Attention, les deux techniques précédentes ne fonctionnent que pour les listes à une dimension, autrement dit les listes qui ne contiennent pas elles-mêmes d'autres listes.

Exemple : Copier une liste ? ATTENTION !
Exemple : Avec deepcopy

T1.3 Révisions : Algorithmes à connaitre

Algorithmes de tris et dichotomie


Premier algo


fonction algo1(tableau) : 
pour i allant de 0 à longueur(tableau)-2 :
imin=i
pour j allant de i+1 à len(tableau)-1 :
si tableau[j] < tableau[imin] :
imin=j
fin de si
fin de pour
if imin!=i:
tableau[i],tableau[imin]=tableau[imin],tableau[i]
fin de si
renvoyer tableau
Exercice à choix multiple
L'algorithme ci-dessus correspond à ...
Correct !
Exercice de code : ALGO 1
Coder le pseudo code donné au dessus.
Une liste lst sera générée pour vous pour la validation.
Dans la fonction, vous introduirez un comptage du nombre de comparaisons effectuées, qui sera affiché avant de sortir de la fonction (comme indiqué dans le code à compléter ci-dessus)

Deuxième algo


fonction algo2(lst) : 
pour i de 1 à len(lst) - 1 # mémoriser lst[i] dans x x ← lst[i] # décaler vers la droite les éléments de lst[0]..lst[i-1] qui sont plus grands que x en partant de lst[i-1] j ← i tant que j > 0 et lst[j - 1] > x lst[j] ← lst[j - 1] j ← j - 1 fin de tant que # placer x dans le "trou" laissé par le décalage lst[j] ← x renvoyer lst
Exercice à choix multiple
L'algorithme ci-dessus correspond à ...
Correct !
Exercice de code : ALGO 2
Coder le pseudo code donné au dessus.
Une liste lst sera générée pour vous pour la validation.
Dans la fonction, vous introduirez un comptage du nombre de comparaisons effectuées, qui sera affiché avant de sortir de la fonction (comme indiqué dans le code à compléter ci-dessus)

Comment interpréter les nombres de comparaison des algorithmes 2 et 3 ?

Pouvez vous donnez le nombre de comparaisons de l'algo 1 pour une liste de 200 valeurs ?

Pour l'algo2, que pourrait on dire ?

Et quelle est la complexité de l'algo 3 ?


Troisième algo


fonction algo3(x,lst) :
imin=0 imax=len(lst)-1 imilieu=(imin+imax)//2 tant que imin <= imax : si lst[imilieu]>x # on va chercher dans la partie de gauche : imax=imilieu-1 sinon si lst[imilieu] < x : # on va chercher dans la partie de droite: imin=imilieu+1 sinon : # on a trouvé x renvoyer True fin de si imilieu=(imin+imax)//2 fin de tant que renvoyer False
Exercice à choix multiple
L'algorithme ci-dessus correspond à ...
Correct !
Exercice de code : ALGO 3
Coder le pseudo code donné au dessus.
Une liste lst sera générée pour vous pour la validation.
Dans la fonction, vous introduirez un comptage du nombre de comparaisons effectuées, qui sera affiché avant de sortir de la fonction (comme indiqué dans le code à compléter ci-dessus)

S'il vous reste du temps...

Modulo 7

Voici un graphe (nous étudierons les graphes plus en détail bientôt) qui permet de calculer N%7 pour tout nombre entier N :

Ce graphe contient des flèches noires et des flèches bleues. Votre premier travail est de modéliser le graphe avec deux dictionnaires : BLACK et BLUE.

Dans chacun des dictionnaires, les clés sont les valeurs de départ des flèches (noires ou blueues) et les valeurs sont les valeurs d'arrivée.

Par exemple, dans le dictionnaire NOIR, la clé 0 à pour valeur 1.

Ensuite, vous devez implementer l'algorithme de détermination de N%7. Etudions un exemple :


Exercice de code : Graphe Modulo 7

T1.a - Révisions cours : les listes

I Principales méthodes de manipulation des Listes

Nous avons utilisé les listes très fréquemment et nous allons rapidement revoir les principales méthodes associées aux objets de type list.

Comme pour les chaînes de caractères, les listes possèdent de nombreuses méthodes qui leur sont propres et qui peuvent se révéler très pratiques. On rappelle qu'une méthode est une fonction qui agit sur l'objet auquel elle est attachée par un point. Nous étudierons la programmation orientée objet (POO) très prochainement.


AJOUTER : .append et .insert


La méthode .append(), ajoute un élément à la fin d'une liste tandis que La méthode .insert() insère un objet dans une liste avec un indice déterminé :

Exemple : mince ! j ai oublié mon d


LOCALISER, COMPTER : .index et .count


La méthode .count() compte le nombre d'éléments (passés en argument) dans une liste :
La méthode .index() donne la position d'un élément dans une liste.

Exemple : Combien de a dans 'abracadabra' ?


TRIER : .sort et .sorted et aussi reverse


La méthode .sort() trie une liste en laissant les valeurs triées dans cette liste tandis que  .sorted() renvoie une copie de la liste triée

Exemple : trier en place ou pas ?


SUPPRIMER : del remove pop


Exemple : suppression d'élément avec remove
Exemple : suppression d'élément : la fonction del
Exemple : suppression d'élément : la méthode pop

Construction d'une liste par itération

La méthode .append() est très pratique car on peut l'utiliser pour construire une liste au fur et à mesure des itérations d'une boucle.

Pour cela, il est commode de définir préalablement une liste vide de la forme maliste = []. Voici un exemple où une chaîne de caractères est convertie en liste :

Exemple : contruction par itération

La méthode avec list(seq) est certes plus simple, mais il arrive parfois qu'on doive utiliser des boucles tout de même, comme lorsqu'on lit un fichier. On rappelle que l'instruction list(seq) convertit un objet de type chaîne de caractères en un objet de type liste. De même que list(range(10)) convertit un objet de type range en un objet de type list ou encore list(dic.keys()) converti la liste des clés d'un dictionnaire en un objet de type liste.


Appartient : in


Exemple : test d'appartenance

Autres méthodes utiles


Le type liste de python dispose de méthodes supplémentaires par rapport à ce qui précède. Voici toutes les méthodes des objets de type liste :

  • list.extend(iterable)
    Étend la liste en y ajoutant tous les éléments de l'itérable. Équivalent à a[len(a):] = iterable.
  • list.clear()
    Supprime tous les éléments de la liste. Équivalent à del a[:].
  • list.index(x[, start[, end]])
    Renvoie la position du premier élément de la liste dont la valeur égale x (en commençant à compter les positions à partir de zéro). Une exception ValueError est levée si aucun élément n'est trouvé. Les arguments optionnels start et end sont interprétés de la même manière que dans la notation des tranches et sont utilisés pour limiter la recherche à une sous-séquence particulière. L'indice renvoyé est calculé relativement au début de la séquence complète et non relativement à start.