les containers (1/2)¶
les listes¶
permet de créer une liste de n’importe quels objets
techniquement, c’est un tableau de pointeurs vers les objets
les listes sont dynamiques, de taille variable
comme une liste est un objet, on peut avoir une liste de listes
les listes¶
L = []
L = [4, 'bob', 10 + 1j, True]
L
[4, 'bob', (10+1j), True]
# les indices en python
# commencent à 0
L[2]
(10+1j)
L[0] = 10
L
[10, 'bob', (10+1j), True]
modification des listes¶
L
[10, 'bob', (10+1j), True]
L[2:]
[(10+1j), True]
L[2:] = [6, 7, 8, 'alice']
L
[10, 'bob', 6, 7, 8, 'alice']
L[1:4] = []
L
[10, 8, 'alice']
attention¶
L[i] = L2
remplace le i-ème élément de
L
par la listeL2
L[i:j] = L2
insère tous les éléments de la liste
L2
à la positioni
après avoir supprimé les éléments
i
jusqu’àj-1
dansL
modification des listes…¶
L = [1, 2, 3, 4, 5]
L
[1, 2, 3, 4, 5]
L[2:4] = [10, 11, 12]
L
[1, 2, 10, 11, 12, 5]
L[3] = [3, 4]
L
[1, 2, 10, [3, 4], 12, 5]
%load_ext ipythontutor
%%ipythontutor curInstr=1 width=800
L = [1, 2, 3, 4, 5]
L[2:4] = [10, 11, 12]
L[3] = [3, 4]
méthodes sur les listes¶
toutes les méthodes sur les séquences
optimisé pour les ajouts à la fin de la liste
L = []
for i in range(4):
L.append(i)
while L:
print(L.pop())
3
2
1
0
si nécessaire, envisager la liste doublement chainée
from collections import deque
deque?
méthodes sur les listes…¶
des méthodes spécifiques aux types mutables
(modifications in-place)L.append(x)
ajoutex
à la fin deL
L.extend(L2)
ajoute chaque élément deL2
à la fin deL
L.insert(i, x)
ajoute x à la positioni
L.sort()
trieL
L.reverse()
renverse les éléments deL
méthodes sur les listes…¶
L.pop(i)
supprime l’élément à la positioni
, si i n’est pas fourni, supprime le dernier élément. La fonction retourne l’élément suppriméutilisé pour faire une pile d’éléments
L.remove(x)
supprime la première occurrence dex
dansL
. S’il n’y a pas dex
, une exception est retournéedel L[i:j:k]
supprime tous les éléments entrei
etj-1
par pas dek
élémentssi
i == j
supprime l’élémenti
digression: range()
¶
range()
est une fonction builtin ou nativequi retourne un objet itérateur
c’est-à-dire sur lequel on peut faire un
for
on y reviendra longuement
for i in range(4):
print(i, end=" ")
0 1 2 3
digression: range()
…¶
essentiellement, même logique que le slicing
range(j)
balaie de0
àj-1
range(i, j)
balaie dei
àj-1
range(i, j, k)
balaie dei
àj-1
par pas dek
pour obtenir une liste on transforme (cast)
en liste en appelantlist()
for i in range(1, 21, 5):
print(i, end=" ")
1 6 11 16
list(range(1, 21, 5))
[1, 6, 11, 16]
méthodes sur les listes…¶
L = list(range(5))
L.append(100)
L
[0, 1, 2, 3, 4, 100]
# comme si append(10)
# puis append(20)
L.extend([10, 20])
L
[0, 1, 2, 3, 4, 100, 10, 20]
L.remove(10)
L
[0, 1, 2, 3, 4, 100, 20]
L.sort()
L
[0, 1, 2, 3, 4, 20, 100]
tri sur les listes¶
le tri des listes est très puissant en Python
tri en place méthode
list.sort()
il a aussi la fonction built-in
sorted()
qui trie toutes les séquences
L = [10, -5, 3, 100]
# tri en place
L.sort()
L
[-5, 3, 10, 100]
L1 = [10, -5, 3, 100]
# crée une copie
L2 = sorted(L1)
print(L1)
print(L2)
[10, -5, 3, 100]
[-5, 3, 10, 100]
https://docs.python.org/3.5/howto/sorting.html
avertissement sur les listes¶
outil très très pratique
mais parfois (souvent) pas nécessaire
car nécessite de la mémoire
alors qu’on veut juste itérer sur le contenu
dans ce cas, techniques + adaptées : itérateurs et autres générateurs
sujet avancé que l’on verra plus tard
les tuples¶
comme des listes, mais immutables
syntaxe:
()
au lieu de[]
mais attention si un seul élément
# syntaxe pour un tuple vide
T = ()
T
()
# syntaxe pour un singleton
T1 = (4,)
# ou encore
T2 = 4,
T1 == T2
True
attention
(4)
est un entier et(4,)
est un tuplec’est la virgule qui est importante
on peut omettre les
()
- la plupart du temps
(mais pas toujours malheureusement)
les tuples¶
# syntaxe pour plusieurs éléments
T1 = (3, 5, 'alice', 10+1j)
# ou encore
T2 = 3, 5, 'alice', 10+1j
# ou encore
T3 = 3, 5, 'alice', 10+1j,
T1 == T2
True
T1 == T3
True
un tuple est non mutable
ce qui le rend hashable :
on peut l’utiliser dans un ensemble
ou comme clé dans un dictionnairepar contre bien sûr les fonctions faisant des modifications
in-place ne s’appliquent pas aux tuples
try:
T1[3] = 5 # python n'est pas content
except Exception as exc:
print(f"OOPS {type(exc)} {exc}")
OOPS <class 'TypeError'> 'tuple' object does not support item assignment