Le type "list" en python
C. Charignon
On récapitule rapidement les caractéristiques du type "list" de python, qui est à peu prêt le seul type complexe
qu’on aura à utiliser dans le cadre strict du programme.
1 Qu’est-ce qu’une "list" python ?
Un objet de type "list" est un tableau redimensionnable. Ainsi, l’accès ou l’écriture à un élément quelconque est
en temps borné (O(1)). Mais l’ajout d’un élément est également possible en temps amorti O(1). Ceci signifie qu’en
moyenne, le temps est en O(1), même si de temps en temps, le temps est en O(n), si nest la longueur du tableau
(lorsqu’il faut tout recopier dans un nouveau tableau plus gros).
Il est important de noter également que le type "list" est mutable. Ainsi une variable de type "list" peut être modifiée
en place, ce qui autorise la programmation par eet de bord. De plus, les copies sont superficielles : l’instruction R=T
ne crée pas un nouvel objet, mais juste un nouveau pointeur vers le même objet. Pour créer une vraie copie, utiliser
deepcopy de la bibliothèque copy. Par exemple
R = copy.deepcopy(T)
Dans la suite, on appellera "tableau" tout objet de type "list".
2 Le type "list" peut émuler d’autres types
Un tableau python peut servir de tableau ou de pile. On rappelle ci-dessous les commandes élémentaires.
tableau :
initialiser un tableau : [ f(i) for i in range(n) ]
lire le ième élément : T[i]
modifier le ième élément : T[i] = ...
pile :
pile vide : []
ajouter un élément x(à la fin 1)p.append(x) .
Fonctionne par eet de bord : renvoie None.
enlever le dernier élément : p.pop(). Ceci renvoie le dernier élément, et modifie le tableau par eet de
bord.
Par contre, comme un tableau python est mutable, on ne peut pas vraiment s’en servir comme d’une liste chaînée
de Caml... On pourrait créer un type de liste chaînée, mais ce n’est pas dans l’esprit python, et c’est largement hors
programme.
Cependant la plupart des algorithmes utilisant des listes chaînées s’adaptent plus ou moins bien. Dans le fond, une
pile est une liste mutable.
1. le "à la fin" correspond juste à la manière dont python ache une liste. Rien ne vous empêche de vous dire que c’est le début et de créer votre
propre fonction d’achage.
1
3 Et le type array ?
Le type "array" est un tableau normal (i.e. non redimensionnable) fournit par la bibliothèque numpy. Il n’est pas
au programme, donc vous n’êtes ociellement pas supposés connaître de commandes pour les utiliser...
L’intérêt de ces tableaux est qu’ils sont plus rapides. Ils sont en particulier optimisés pour les calculs matriciels.
La syntaxe des commandes également est optimisée pour le calcul matriciel.
Première partie
Exercices
2
Exercices : utilisation des tableaux python comme listes ou comme piles
Exercice 1. * écriture polonaise inversée
Écrire une fonction pour calculer une expression donnée en écriture polonaise inversée. Comme python ne permet
pas de créer de type, on utilisera juste un tableau contenant des nombres et des chaînes de caractères.
Remarque: Les tableaux python sont "polymorphes", ce qui signifie qu’on peut y mettre des objets de diérents types.
Exercice 2. *** dérécursifier l’algorithme des tours de Hanoï
Souvenez-vous du jeu des tours de Hanoï. Trois tiges, ndisques qu’il faut déplacer de la première à la deuxième
tige en faisant en sorte qu’à chaque instant, sur chaque tige, les disques soient placés du plus gros au plus petit.
On rappelle l’algorithme utilisé pour le résoudre :
Entrées :
n, entier (nombre de disques à déplacer)
d~1,3(tige de départ)
a~1,3(tige d’arrivée)
début
si n=1:
Déplacer le disque de dvers a
sinon:
ila tige intermédiaire
Appliquer l’algorithme pour déplacer les n1 premiers disques de dvers i
Déplacer le dernier disque de dvers a
Appliquer l’algorithme pour déplacer les n1 disques de ivers a
fin
fin
Algorithme 1 : tours de Hanoï (récursif)
1. Programmer cet algorithme en python. Le résultat du programme sera d’acher des messages du type "déplacer
un disque de la tige 1 vers la tige 2".
2. On désire maintenant écrire une version non récursive de ce programme. Le principe est simple : nous allons
gérer nous même la pile des appels. On va maintenir une pile aFaire qui contient les prochaines opérations à
faire. Pour enregistrer le fait qu’il faut déplacer kdisque de la tige ivers la tige j, nous enregistrerons le triplet
(k,i,j).
Ainsi, nous initialiserons la pile par aFaire =[ (n,d,a) ]. Puis après une étape de l’algorithme, elle devien-
dra [ (n-1,i,a) , (1,d,a) , (n-1,d,i) ], où iest la tige intermédiaire calculée au préalable.
Exercice 3. ** tri Fusion
Le tri fusion est un tri particulièrement adapté aux listes chaînées. On propose de l’adapter pour trier des tableaux
python.
Quels sont les inconvénients par rapport à la version utilisant des vraies listes chaînées comme en Caml ?
1
Quelques solutions
1
2
3
2
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !