Chapitre 10 : Plus sur les listes

         1 – Propriétés des listes

    Jusqu’à maintenant, nous avons toujours utilisé des listes qui étaient déjà remplies. Nous savons comment modifier un de ses éléments, mais il est aussi parfois très pratique d’en remanier la taille (e. g. ajouter, insérer ou supprimer un ou plusieurs éléments, etc.). Les listes possèdent à cet effet des méthodes qui leurs sont propres. Observez les exemples suivants :


append()
pour ajouter un élément à la fin d’une liste.

Code python

>>> x = [1,2,3]
>>> x.append(5)
>>> x
[1, 2, 3, 5]

Code python

qui est équivalent à
>>> x = [1,2,3]
>>> x = x + [5]
>>> x
[1, 2, 3, 5]

insert()
pour insèrer un object dans une liste avec un indice déterminé.

Code python

>>> x.insert(2,-15)
>>> x
[1, 2, -15, 3, 5]

del
pour supprimer un élément d’une liste à une indice déterminé.

Code python

>>> del x[1]
>>> x
[1, -15, 3, 5]

remove()
pour supprimer un élément d’une liste à partir de sa valeur

Code python

>>> x.remove(5)
>>> x
[1, -15, 3]

sort()
pour trier une liste.

Code python

>>> x.sort()
>>> x
[-15, 1, 3]

reverse()
pour inverser une liste.

Code python

>>> x.reverse()
>>> x
[3, 1, -15]

count()
pour compter le nombre d’éléments (passé en argument) dans une liste.

Code python

>>> l=[1, 2, 4, 3, 1, 1]
>>> l.count(1)
3
>>> l.count(4)
1
>>> l.count(23)
0
Remarque 1 : attention, une liste remaniée n’est pas renvoyée ! Pensez-y dans vos utilisations futures des listes.

Remarque 2 : attention, certaines fonctions ci-dessus décalent les indices d’une liste (par exemple insert(), del etc).

La méthode append() est particulièrement pratique car elle permet de 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 :

Code python

>>> seq = ‘CAAAGGTAACGC’
>>> seq_list = []
>>> seq_list
[]
>>> for i in seq:
… seq_list.append(i)

>>> seq_list
[‘C’, ‘A’, ‘A’, ‘A’, ‘G’, ‘G’, ‘T’, ‘A’, ‘A’, ‘C’, ‘G’, ‘C’]
Remarquez que vous pouvez directement utiliser la fonction list() qui prend n’importe quel objet séquentiel (liste, chaîne de caractères, tuples, etc.) et qui renvoie une liste :

Code python

>>> seq = ‘CAAAGGTAACGC’
>>> list(seq)
[‘C’, ‘A’, ‘A’, ‘A’, ‘G’, ‘G’, ‘T’, ‘A’, ‘A’, ‘C’, ‘G’, ‘C’]
Cette méthode est certes plus simple, mais il arrive parfois que l’on doive utiliser les boucles tout de même, comme lorqu’on lit un fichier.

         2 – Copie de listes

    Il est très important de savoir que l’affectation d’une liste (à partir d’une liste préexistante) crée en réalité une référence et non une copie :

Code python

>>> x = [1,2,3]
>>> y = x
>>> y
[1, 2, 3]
>>> x[1] = -15
>>> y
[1, -15, 3]
Vous voyez que la modification de x modifie y aussi. Rappelez-vous de ceci dans vos futurs programmes car cela pourrait avoir des effets désastreux ! Techniquement, Python utilise des pointeurs (comme dans le langage C) vers les mêmes objets et ne crée pas de copie à moins que vous n’en ayez fait la demande explicitement. Regardez cet exemple :

Code python

>>> x = [1,2,3]
>>> y = x[:]
>>> x[1] = -15
>>> y
[1, 2, 3]
Dans l’exemple précédent, x[:] a créé une copie «à la volée »de la liste x. Vous pouvez utiliser aussi la fonction list() qui renvoie explicitement une liste:

Code python

>>> x = [1,2,3]
>>> y = list(x)
>>> x[1] = -15
>>> y
[1, 2, 3]
Attention, les deux techniques précédentes ne fonctionnent que pour les listes à une dimension, autrement dit les listes qui ne contienent pas elles-mêmes d’autres listes.

Code python

>>> x = [[1,2],[3,4]]
>>> x
[[1, 2], [3, 4]]
>>> y = x[:]
>>> y[1][1] = 55
>>> y
[[1, 2], [3, 55]]
>>> x
[[1, 2], [3, 55]]
>>> y = list(x)
>>> y[1][1] = 77
>>> y
[[1, 2], [3, 77]]
>>> x
[[1, 2], [3, 77]]
La méthode de copie qui marche à tous les coups consiste à appeler la fonction deepcopy() du module copy.

Code python

>>> import copy
>>> x = [[1,2],[3,4]]
>>> x
[[1, 2], [3, 4]]
>>> y = copy.deepcopy(x)
>>> y[1][1] = 99
>>> y
[[1, 2], [3, 99]]
>>> x
[[1, 2], [3, 4]]

         3 – Exercices

    Conseil : pour ces exercices, écrivez des scripts dans des fichiers, puis exécutez-les dans un shell.

Soit la liste de nombres [8, 3, 12.5, 45, 25.5, 52, 1]. Triez les nombres de cette liste par ordre croissant, sans utiliser la fonction sort() (les fonctions min(), append() et remove() vous seront utiles).
Générez aléatoirement une séquence nucléique de 20 bases en utilisant une liste et la méthode append().
Transformez la séquence nucléique TCTGTTAACCATCCACTTCG en sa séquence complémentaire inverse. N’oubliez pas que la séquence complémentaire doit être inversée, pensez aux méthodes des listes !
Soit la liste de nombres [5, 1, 1, 2, 5, 6, 3, 4, 4, 4, 2]. Enlevez les doublons de cette liste, triez-là et affichez-là.
Générez aléatoirement une séquence nucléique de 50 bases contenant 10 % de A, 50 % de G, 30 % de T et 10 % de C.
Exercice +++. Triangle de Pascal
Voici le début du triangle de Pascal :

Code python

1
11
121
1331
14641

Comprenez comment une ligne est construite à partir de la précente. À partir de l’ordre 1 (ligne 2, 11), générez l’ordre suivant (121). Vous pouvez utiliser une liste préalablement générée avec range(). Généralisez à l’aide d’une boucle. Écrivez dans un fichier pascal.out les lignes du triangle de Pascal de l’ordre 1 jusqu’à l’ordre 10.