Conteneurs
En plus des 6 types de bases, python met à notre disposition plusieurs objets qui peuvent contenir d'autres objets.
Un conteneur est un objet itérable et possède l'opérateur in
(comme on l'a déjà vu avec les chaînes de caractères). On pourra ainsi toujours utiliser x in C
pour savoir si l'objet x
est dans le conteneur C
.
Parmi ces conteneurs, la liste est certainement la plus utilisée.
Listes et tuples
Listes
Tuples
Un tuple est une liste non-modifiable : les objets present dans le tuple sont déterminés à sa creation. On crée un tupe comme une liste en remplaçant les crochets par des parenthèses :
>>> t = (1, "deux", 3)
On les utilise ensuite comme une liste :
>>> len(t)
3
>>> t[1]
'deux'
Les méthodes de listes qui ne modifient pas la liste sont utilisables, par exemple :
>>> t.index(3)
2
Mais modifier les éléments d'un tuple est interdit :
>>> t[0] = "un"
Traceback (most recent call last):
File "<python-input-8>", line 1, in <module>
t[0] = "un"
~^^^
TypeError: 'tuple' object does not support item assignment
Tout comme les méthodes modifiant la liste :
>>> t.append(4)
Traceback (most recent call last):
File "<python-input-7>", line 1, in <module>
t.append(4)
^^^^^^^^
AttributeError: 'tuple' object has no attribute 'append'
Les tuples sont très pratiques lorsque l'on veut créer un conteneur qui puisse être donner à d'autres méthodes ou fonctions sans crainte qu'elle soit modifié. Dans le doute : utilisez des tuples plutôt que des listes, cela vous évitera des problèmes.
On finira cette partie par quelques cas d'usage courant.
Créer un tuple de 1 élément
t = (2,)
Si vous oubliez la virgule, vous ne ferez que mettre des parenthèses autour de l'entier 2.
Créer un tuple issu d'une itération
Comme un tuple est fixé à sa création, pour créer un tuple issue d'une itération, on commence par créer une liste puis on la transforme en tuple :
>>> l = []
>>> for i in range(10):
... l.append(i **2)
...
>>> t = tuple(l)
>>> t
(0, 1, 4, 9, 16, 25, 36, 49, 64, 81)
Attention
Si un tuple n'est pas modifiable, ce nest pas le cas des objets qui le compose.
>>> t = ((1, 2), [1, 2])
>>> t[1].append(3)
>>> t
((1, 2), [1, 2, 3])
Ensembles et dictionnaires
Les deux autres conteneurs à connaître sont les ensembles et les dictionnaires. Ces deux structures sont très utiles lorsque l'on manipule des données mais sont plus complexes à manipuler que des listes. Prenez le temps d'apprendre à utiliser leurs nombreux avantages.
Les ensembles et les dictionnaires sont tous deux des conteneurs, donc itérables mais contrairement aux listes, leur ordre d'itération est inconnu. Il peut changer d'une itération à l'autre.
Ensembles
Dictionnaires
Chaînes de caractères
Les chaînes de caractères peuvent être vues comme un cas particulier de liste.
Cas particulier d'un tuple
Une chaîne de caractères peut être vue comme un conteneur de caractères. On peut donc accéder à un caractère particulier comme une liste :
>>> "abcdefghijklmnopqrstuvwxyz"[2]
'c'
Ou même utiliser des slices de liste :
>>> "abcdefghijklmnopqrstuvwxyz"[2:15:4]
'cgko'
En revanche, il est impossible de modifier une chaîne :
>>> x = "Francois"
>>> x[4] = "ç"
Traceback (most recent call last):
File "<python-input-4>", line 1, in <module>
x[4] = "ç"
~^^^
TypeError: 'str' object does not support item assignment
>>>
Entraînons nous un peut à manipuler les chaînes de caractères sous la forme d'un conteneur en reprenant le 27ème nombre de Mersenne sous sa forme chaîne de caractères : m27 = str(2 ** 44497 - 1)
.
Quels sont les 10 premiers chiffres de m27
?
solution
solution
str(m27)[:10]
Quels sont les 10 derniers chiffres de m27
?
solution
solution
str(m27)[-10:]
Est-ce que m27
est un palindrome ?
solution
solution
str(m27) == str(m27)[::-1]
(s[::-1]
renverse la chaîne)
En revanche, il est interdit de modifier une chaine de caractère :
>>> x = "chaine"
>>> x[0] = "C"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
Enfin on ne le répètera jamais assez, python vient avec tout un tas de méthodes utilitaires permettant de résoudre nombre d'opérations courantes. Utilisez la documentation sur les méthodes de chaînes en python pour résoudre les exercices suivants :
Index de la première occurrence de 1234
dans m27. Et de la deuxième ?
solution
solution
str(m27).find('1234')
str(m27).find('1234', 19260 + 1)
: la première occurrence est à l'indice 19260, on cherche donc après.- on peut faire en une ligne :
str(m27).find('1234', str(m27).find('1234') + 1)
Méthodes de chaînes de caractères
byte
et str
Par défaut toutes les chaînes de caractères sont de type str
, et encodées en utf-8
. Si on veut connaître explicitement les octets d'une chaîne, il faut l'encoder en un autre format par la méthode encode
des chaînes de caractères qui rend un objet de type byte qui est une suite d'octets.
C'est comme une chaîne de caractères mais qui commence par b
. On peut ensuite décoder un byte pour le retransformer en str
:
x = "ma chaîne de caractères"
x_en_byte = x.encode('utf8') # devient : b'ma cha\xc3\xaene de caract\xc3\xa8res'
re_x = x_en_byte.decode('utf8')
Ceci va s'avérer utile lorsque l'on récupérera des fichiers depuis internet. Ce seront des byte
qu'il faudra re-écrire en utf8
.
Les différents encoding possibles sont disponibles dans la documentation.
Exercices
On utilisera les nombres de Mersenne comme prétexte à la manipulation de chaînes de caractères en python. Ces exercices sont pour une grande partie tirés d'un cours donné il y a quelques temps par Aristide Grange, à l'université Paul Verlaine de Metz.
Notez m27
le 27ième nombre de Mersenne $2^{44497} -1$ :
solution
solution
m27 = 2 ** 444497 - 1
Combien de chiffres en base 10, 2 et 16 possède ce nombre ?
solution
solution
- en base 10 :
len(str(m27))
: conversion de l'entier en chaîne de caractères puis son nombre de chiffres - en base 2 :
len(bin(m27)) - 2
:bin
transforme un entier en sa représentation binaire. C'est une chaîne de caractères qui commence par0b
donc on retranche 2 à la longueur. - en base 16 :
len(hex(m27)) - 2
:hex
transforme un entier en sa représentation hexadécimale. C'est une chaîne de caractères qui commence par0x
donc on retranche 2 à la longueur.
Méthodes de chaînes de caractères
Utilisez la documentation sur les méthodes de chaînes en python pour résoudre les exercices suivants
Index de la première occurrence de 1234
dans m27. Et de la deuxième ?
solution
solution
str(m27).find('1234')
str(m27).find('1234', 19260 + 1)
: la première occurrence est à l'indice 19260, on cherche donc après.- on peut faire en une ligne :
str(m27).find('1234', str(m27).find('1234') + 1)
Slice
Comme pour les listes, on peut utiliser les slices pour copier des parties de chaîne.
Ainsi "abcdefghijklmnopqrstuvwxyz"[2:15:4]
vaut : 'cgko'
.
Quels sont les 10 premiers chiffres de m27 ?
solution
solution
str(m27)[:10]
Quels sont les 10 derniers chiffres de m27 ?
solution
solution
str(m27)[-10:]
Est-ce que m27 est un palindrome ?
solution
solution
str(m27) == str(m27)[::-1]
(s[::-1]
renverse la chaîne)
Chaînes formatées
On a déjà vu les f-string, on peut faire plus en utilisant :
- la méthode
format
qui est la méthode historique de formatage de chaines en python, - les chaînes de modèles conforme aux normes d'internationalisation.
TBD en python 3.14 les t-string implémentent les template-string directement : https://davepeck.org/2025/04/11/pythons-new-t-strings/