4.4. Les tuples

Un tuple est un ensemble ordonné de valeurs qui s’utilise exactement de la même manière qu’une liste, si ce n’est qu’il est impossible de changer ses éléments. On le déclare en utilisant des parenthèses en lieu et place des crochets. Comme les listes, les tuples peuvent contenir des nombres entiers ou décimaux, des chaînes de caractères, des listes, d’autres tuples, etc.

empty_tuple = ()  # tuple vide

4.4.1. Avantages des tuples sur les listes

Si les tuples s’utilisent comme les listes, ils ont certaines particularités qui les rendent préférables pour certaines tâches. Tout d’abord, parcourir un tuple est plus rapide qu’avec une liste parce qu’ils ne sont pas modifiables. La nature invariable des tuples les rend également plus appropriés comme clés de dictionnaires (que nous verrons par la suite). Ils sont aussi particulièrement utiles pour gérer des données dont on veut s’assurer qu’elles seront inaltérables. On mentionnera finalement que les listes sont généralement privilégiées pour stocker des données du même type alors que les tuples sont plutôt utilisés pour différents types de données.

4.4.2. Déclaration de tuple

L’exemple ci-dessous illustre la création d’un tuple mixte.

mixed_tuple = ("tomate", [5, 6, 7], 12.1, (1, "chocolat"))
print(mixed_tuple)
('tomate', [5, 6, 7], 12.1, (1, 'chocolat'))

Attention

Il faut impérativement ajouter une virgule lorsqu’un tuple ne contient qu’un seul élément, sans quoi les parenthèses conservent leur rôle habituel pour groupement d’opérations, comme illustré ci-dessous.

tuple1 = (1)
print(tuple1, "\t", type(tuple1))

tuple2 = (1,)
print(tuple2, "\t", type(tuple2))
1       <class 'int'>
(1,)    <class 'tuple'>

Dans le premier exemple, le tuple est en réalité une variable contenant un entier. Dans le deuxième cas, la virgule précise que l’on souhaite créer un tuple.

4.4.3. Accéder aux éléments d’un tuple

On accède aux éléments d’un tuple de la même manière que pour une liste, grâce à leur indice. La syntaxe est identique avec l’utilisation des crochets ([, ]) après le nom du tuple.

my_tuple = (1, 2, 3)

print(my_tuple[0])
print(my_tuple[2])
print(my_tuple[0:2])
print(my_tuple[:-2])
print(my_tuple[:])
1
3
(1, 2)
(1,)
(1, 2, 3)

La figure 4.3 ci-dessous illustre la structure d’un tuple et la manière d’accéder à ses éléments. Le tuple tpl comprend 4 éléments de types différents : un nombre entier, une chaîne de caractères, un nombre décimal et une liste d’entiers. Tout comme pour les listes, les éléments du tuple peuvent être accédés à l’aide de leur indice, par exemple tpl[0] pour le premier élément et tpl[3] (ou tpl[-1]) pour le dernier. On notera qu’il est possible d’accéder directement aux éléments d’un type composé contenu dans un tuple en combinant les opérateurs d’indexation, comme dans le cas de tpl[3][0] illustré dans la figure.

Tuple

Fig. 4.3 Tuple.

4.4.4. Modifier un élément d’un tuple

Comme expliqué précédemment, il n’est pas possible de modifier un tuple, et donc d’y ajouter ou d’en supprimer une valeur. Il est cependant possible de changer les éléments d’une structure de données variable à l’intérieur d’un tuple, par exemple une liste. Pour cela il faut d’abord accéder à la liste, puis à l’élément de cette liste que l’on souhaite modifier.

even = (2, 4, 6, [8, 10, 12])

even[3][0] = 14  # on peut modifier le contenu d'une liste du tuple
print("Nombres pairs : " + str(even))

even[0] = 14  # erreur : on essaye de modifier une valeur du tuple !
Nombres pairs : (2, 4, 6, [14, 10, 12])

Traceback (most recent call last):
  File "<input>", line...
TypeError: 'tuple' object does not support item assignment

4.4.5. Concaténation et réplication

De la même manière qu’avec les chaînes de caractères et les listes, les opérateurs + et * permettent de combiner et répliquer des tuples.

tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)

print(tuple1 + tuple2)
print(tuple1 * 2)
(1, 2, 3, 4, 5, 6)
(1, 2, 3, 1, 2, 3)

4.4.6. Parcourir un tuple

Comme pour les autres types de données composés, il est possible de parcourir les tuples avec une boucle for.

flowers = ('la rose', 'le lilas', 'la primevère')

for f in flowers:
  print("Ma fleur préférée est " + f)
Ma fleur préférée est la rose
Ma fleur préférée est le lilas
Ma fleur préférée est la primevère