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
Jeu sur la casse des mots d'une phrase
Formatage d'une séquence avec 60 caractères par ligne
Exemple d'une séquence constituée de 150 alanines :
Cette section est particulièrement importante et doit être bien comprise
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 :
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.
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 !
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 !
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 !
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 :
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é :
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.
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
SUPPRIMER : del remove 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 :
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
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.