Participer au site avec un Tip
Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Manipulation de tuples

Manipulation de listes Manipulation de sets


Accès rapide :
La vidéo
Présentation du type tuple
Définition de tuples
Accéder aux valeurs d'un tuple
Vérifier la présence ou non d'une données dans le tuple
Parcourir un tuple
La notion de « tuple unpacking »
La notion de « slicing »
Utilisation conjointe d'un tuple et d'un générateur
Compléments sur la manipulation de vos tuples
Quelques fonctions applicables aux tuples
Quelques méthodes de la classe tuple
Quelques opérateurs de la classe tuple
Typage de vos tuples
Travaux pratiques
Les énoncés
Les corrections

La vidéo

Cette vidéo vous montre comment utiliser des tuples (des listes immuables) en Python.


Manipulation de tuples en Python.

Présentation du type tuple

Définition de tuples

En Python, le type tuple permet de représenter une liste de données immuable : une fois instancié, il n'est plus possible de changer le contenu d'un tuple (ce qui n'est pas le cas d'une liste Python). Pour introduire un tuple, il faut utiliser une paire de parenthèses, contrairement à une liste ou il fallait utiliser une paire de crochets. Voici un premier exemple de définition de tuple.

>>> data = (10, 20, 30, 40, 50)
>>> data
(10, 20, 30, 40, 50)
>>> type(data)
<class 'tuple'>
>>> 
Exemple de définition d'un tuple en Python

Comme nous l'avons dit, une fois son instanciation terminée, un tuple est immuable (non modifiable). Le plus simple, pour s'en rendre compte, est de tenter de modifier une valeur du tuple ou de supprimer une information. Voici les messages d'erreurs qui seront alors produits.

>>> data = (10, 20, 30, 40, 50)
>>> data[2]
30
>>> data[2] = 3000
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> del data[2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item deletion
>>> data.append(60)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
>>> 
Un tuple est non modifiable.

Un tuple Python n'est pas limité à un type de données unique : vous pouvez donc avoir des données quelconque dans un tuple. Voici un exemple de définition d'un tuple contenant des données diverses et variées.

>>> data = (10, 2.3, True, "Une chaîne", False, ["une", "sous", "liste"])
>>> data
(10, 2.3, True, 'Une chaîne', False, ['une', 'sous', 'liste'])
>>> 
Un tuple peut contenir de données de types divers et variés.

Accéder aux valeurs d'un tuple

Une première chose à savoir, c'est quelle est la taille (le nombre d'éléments qui le constitue) de votre tuple. Pour ce faire, il faut utiliser la fonction len.

>>> data = (10, 20, 30, 40, 50)
>>> nb = len(data)
>>> print("Nombre d'éléments :", nb)
Nombre d'éléments : 5
>>> 
Récupération de la taille d'un tuple

Une fois la taille du tuple connue, vous pouvez commencer à manipuler les valeurs qui y sont contenues via l'opérateur []. Cet opérateur permet d'accéder à un élément du tuple par sa position. Il est important de mémoriser que les indices (les positions) dans un tuple commencent à 0. Ainsi, si un tuple contient cinq éléments alors les indices seront compris entre 0 et 4. Voici un exemple de récupération des valeurs d'un tuple.

>>> data = (10, 20, 30, 40, 50)
>>> data[0]     # On récupère le premier élément
10
>>> data[1]     # Le second
20
>>> data[2]
30
>>> data[3]
40
>>> data[4]     # Le dernier élément du tuple
50
>>> data[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
>>> 
Accès par position aux éléments d'un tuple.

Contrairement à certains autres langages de programmation, Python autorise l'utilisation d'index négatifs : Dans ce cas, on accède aux valeurs de la collection par la fin : -1 correspond à l'indice du dernier éléments du tuple, -2 correspond à l'indice de l'avant-dernier élément... Voici un exemple d'utilisation d'index négatif.

>>> data = (10, 20, 30, 40, 50)
>>> data[-1]    # Dernier élément
50
>>> data[-2]
40
>>> data[-3]
30
>>> data[-4]
20
>>> data[-5]
10
>>> data[-6]    # Premier élément
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
>>> 

Vérifier la présence ou non d'une données dans le tuple

Il est aussi possible de savoir si une valeur est présente dans le tuple en utilisant l'opérateur in. Voici un exemple d'utilisation.

>>> l = (10, 20, 30, 40, 50)
>>> 10 in l
True
>>> 100 in l
False
>>> is_present = 30 in l
>>> if is_present: print("30 est présent dans le tuple")
... 
30 est présent dans le tuple
>>> 

A contrario, vous pouvez vérifier si une information n'est pas présente dans le tuple avec l'opérateur not in. Voici des exemples d'utilisation.

>>> data = (10, 20, 30, 40, 50)
>>> 20 not in data
False
>>> 25 not in data
True
>>> 

Parcourir un tuple

Il est bien entendu possible de parcourir tous les éléments d'un tuple. Pour ce faire, vous pouvez utiliser une boucle while. Il faudra juste gérer un index qui va s'incrémenter au fur et à mesure de la progression dans le tuple. Tapez les lignes de code suivantes dans un éditeur Python (PyCharm par exemple) et non pas dans l'interpréteur interactif.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
data = (10, 20, 30, 40, 50)

# On démarre le parcours à partir de la première position
index = 0

# On calcule, une fois pour toute, la taille du tuple
length = len(data)

# On traite chaque élément du tuple, un par un
while index < length:
    value = data[index]
    index += 1
    
    print(value)
    
print("Parcours terminé")
Fichier sample.py : exemple de parcours d'une liste avec une boucle while

Et voici les résultats produits par cet exemple.

$> python sample.py
10
20
30
40
50
Boucle while terminée
$> 

Bien que la boucle while fonctionne parfaitement, ce n'est pas la meilleure manière de parcourir tous les éléments d'un tuple. Une autre construction est bien plus pratique : la boucle for. Effectivement, celle-ci vous évite de gérer l'index de parcours vous-même et elle va vous permettre de récupérer chaque valeur du tuple à tour de rôle dans une variable.

La syntaxe est simple : on commence par le mot clé for suivit du nom de la variable qui va recevoir une à une les valeurs de la collection, puis on trouve le mot clé in lui-même suivit de la collection à traiter et enfin un caractère : introduit le bloc d'instructions à exécuter à chaque tour de boucle. En voici un exemple d'utilisation.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
data = (10, 20, 30, 40, 50)

# On traite chaque élément du tuple, un par un
for value in data:
    print(value)
    
print("Parcours terminé")
Fichier sample.py : exemple de parcours d'une liste avec une boucle for

Les résultats sont exactement les mêmes que ceux produits par la boucle while. Et vous aurez certainement validé la simplicité de la syntaxe, comparé à la boucle while.

La notion de « tuple unpacking »

Le « tuple unpacking » (déballage de tuple, en français) consiste à sortir les valeurs stockées dans un tuple dans un ensemble de variables nommées.

le nombre de variables utilisées doit être très exactement le même que le nombre de valeurs contenues dans le tuple, sans quoi une erreur (une exception) vous sera retournée.
>>> data = (10, 20, 30)
>>> a, b, c = data
>>> a
10
>>> b
20
>>> c
30
>>> a, b = data
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
>>> 
Exemple d'un déballage de tuple dans trois variables.
ultérieurement cette possibilité nous sera très utile car certaines fonctions de la librairie Python renvoient des tuples. Vous pourrez alors récupérer les résultats dans des variables, ce qui rendra votre programme plus compréhensible.

La notion de « slicing »

Nous avons parlé de l'opérateur [] qui permet d'accéder aux éléments d'un tuple. Pour le moment, nous avons accédé aux valeurs une à une, mais il est aussi possible d'accéder à plusieurs valeurs du tuple via un seul appel à l'opérateur [] (un sous-tuple). Dans ce cas, on parle de « slice » (de tranches, si l'on parle en français).

Pour extraire une sous-tuple, à l'instar des chaînes de caractères ou des listes, il faut passer l'indice de début (basé à partir de 0) et l'indice de fin (position exclusive) de cette dernière. Les deux indices doivent être séparés par un caractère :. Voici quelques exemples d'utilisation.

>>> data = (10, 20, 30, 40, 50)
>>> data[1:3]
(20, 30)
>>> data[1:4]
(20, 30, 40)
>>> data[1:5]
(20, 30, 40, 50)
>>> data[:4]
(10, 20, 30, 40)
>>> data[2:]
(30, 40, 50)
>>> data[:]
(10, 20, 30, 40, 50)
>>> 
comme vous le constatez, si vous ne mentionnez pas l'indice de début, la valeur 0 sera considérée. De même, si vous ne spécifiez pas l'indice de fin, la valeur len(le_tuple) sera considérée. Dans les deux cas, le caractère : doit impérativement être présent, sans quoi un seul élément du tuple sera considéré.
l'indice de fin est exclusif, ce qui implique que la valeur à la position de fin ne fera pas partie du sous-tuple. Le nombre d'éléments à extraire vaut donc indice_de_fin - indice_de_debut : data[1:4] permettra donc d'extraire 3 valeurs (4 - 1 = 3).

Il est aussi possible d'extraire les éléments d'un sous-tuple tout les « n » éléments. Imaginons que vous ayez une liste qui contiennent des coordonnées x, y qui suivent les une après les autres. Si vous souhaitez extraire que les abscisses (les x), vous pouvez le faire en spécifiant la slice suivante : coords[::2] (avec le pas en troisième paramètre de la slice). Pour obtenir toutes les ordonnées (les y), veuillez utiliser la slice suivante : coords[1::2], pour débuter l'extraction à partir de la seconde valeur par pas de 2. Voici un exemple d'utilisation.

>>> #         x, y, x,  y, x,  y,  x, y
>>> coords = (0, 0, 10, 5, 13, 12, 5, 7)
>>> 
>>> all_x = coords[::2]
>>> all_x
(0, 10, 13, 5)
>>> 
>>> all_y = coords[1::2]
>>> all_y
(0, 5, 12, 7)
>>> 

Utilisation conjointe d'un tuple et d'un générateur

Un générateur est un objet permettant de produire des séquences de valeurs. Il est possible de produire un générateur assez facilement, comme le montre l'exemple suivant.

>>> g = (i for i in range(10) if i%2 == 0)
>>> g
<generator object <genexpr> at 0x7f72949d0f20>
>>> type(g)
<class 'generator'>
>>> for value in g: print(value)
... 
0
2
4
6
8
>>> 
Exemple de définition d'un générateur Python.
la manière utilisée pour produire notre générateur consiste à placer l'algorithme de génération entre parenthèses. Mais, pour autant, il ne s'agit pas d'un tuple ! C'est un générateur.
nous reparlerons ultérieurement, dans un futur chapitre, de cette notion de générateur.

Vous pouvez construire un tuple à partir d'un générateur en passant par le constructeur de la classe tuple : dans ce cas, il est possible de ne pas mettre les parenthèses du générateur, étant donné qu'on a déjà la paire de parenthèses de l'appel au constructeur.

>>> # Avec les parenthèses du générateur
>>> t = tuple((i for i in range(10) if i % 2 == 0))
>>> t
(0, 2, 4, 6, 8)
>>> 
>>> # Sans les parenthèses du générateur
>>> t2 = tuple(i for i in range(10) if i % 2 == 0)
>>> t2
(0, 2, 4, 6, 8)
>>> 
>>> t == t2
True
>>> type(t)
<class 'tuple'>
>>>
Utilisation conjointe d'un tuple et d'un générateur.

Compléments sur la manipulation de vos tuples

Quelques fonctions applicables aux tuples

Il existe de nombreuses fonctions applicables aux tuples Python. Nous pouvons notamment citer :

ces fonctions peuvent aussi s'appliquer à d'autres types de collections (on parle d'itérables) et notamment aux listes et aux sets.

Quelques méthodes de la classe tuple

Vous vous en doutez, la classe tuple expose aussi quelques méthodes bien utiles. En voici quelques-unes : vous pouvez cliquer sur le nom de la méthode pour en obtenir un descriptif plus détaillé.

Méthode Description
count Compte le nombre d'occurrences de la valeur spécifiée en paramètre.
index Renvoie la position de la première occurrence d'une valeur dans le tuple courant.

Quelques opérateurs de la classe tuple

De nombreux autres opérateurs sont aussi proposés par la classe tuple. Voici quelques exemples d'utilisation.

>>> t = (10, 20, 30, 40, 50)
>>> t2 = (60, 70, 80, 90, 100)
>>> 
>>> # Concaténation de tuples
>>> full = t + t2
>>> full
(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
>>> 
>>> # Répétition d'un tuple
>>> t * 3
(10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 10, 20, 30, 40, 50)
>>> 
>>> # Comparaison de tuples
>>> t == t2
False
>>> 
>>> # Recherche d'une valeur dans un tuple
>>> 30 in t
True
>>> 70 in t
False
>>> 
Exemple d'utilisation d'opérateurs disponibles pour vos tuples.

Typage de vos tuples

Nous avons vu, dans les chapitres précédents, qu'il était possible de spécifier le type de vos variables lors de leurs déclarations. Il en va de même pour vos tuples et vous pouvez même indiquer le type des éléments qu'un tuple doit contenir. Voici un exemple de code indiquant que la variable data sera typée en tant que tuple de valeurs flottantes (tuple[float]).

 1 
 2 
 3 
# Attention : Python 3.9 ou supérieur requis !!!
data: tuple[float] = (10, 20.2, 13.4)
print(data)
Typage d'une variable en tant que tuple de valeurs flottantes.
cette syntaxe, permettant de contrôler le type des éléments contenus dans le tuple, est disponible en Python depuis sa version 3.9. Si vous utilisez une version antérieure, il faudra adapter le code en utilisant un module de code supplémentaire via l'instruction suivante from typing import Tuple. Il faudra alors utiliser le type Tuple[float]. Voici un exemple d'utilisation.
 1 
 2 
 3 
 4 
 5 
from typing import Tuple

# Syntaxe recommandée pour des versions antérieures à Python 3.9            
data: Tuple[float] = [10, 20.2, 13.4]
print(data)
Typage d'une variable en tant que tuple de valeurs flottantes.

N'oubliez pas que certains IDEs peuvent vérifier les informations de typage : c'est le cas de PyCharm. Si vous tentez d'insérer autre chose qu'une valeur flottante dans le tuple ci-dessus, l'IDE pourra signaler cette incohérence. Voici une capture d'écran de PyCharm montrant cette capacité.

Contrôle de typage par PyCharm.

Vous pouvez aussi utiliser l'outil « mypy » pour vérifier la cohérence des types de votre programme. Voici un exemple de vérification.

[$> mypy test_typing.py 
test_typing.py:2: error: Incompatible types in assignment (expression has type "Tuple[int, float, float, str]", variable has type "Tuple[float]")
Found 1 error in 1 file (checked 1 source file)
$> 
Contrôle de typage par l'intermédiaire de l'outil mypy.

Travaux pratiques

Les énoncés

Exercice 1 : je vous donne le tuple suivant comme base de travail. Il est constitué de triplets d'informations associés à des villes. La première information est le nom de la ville (dans l'exemple, des villages du sud de la France : faut venir les visiter ;-) ), la seconde information est la latitude du lieu et enfin on trouve la longitude. Il peut y avoir un nombre quelconque de triplet.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
data = (
    "Andon", 43.77348, 6.78596,
    "Caille", 43.77887, 6.72979,
    "Séranon", 43.77435, 6.70415,
    "Valderoure", 43.79629, 6.70749
    # Vous ne devez pas présager du nombre de triplets.
)
Le tuple de départ

Débrouillez-vous pour en extraire les données et produire l'affichage suivant :

+---------------+---------------+---------------+
| Ville         |      Latitude |     Longitude |
+---------------+---------------+---------------+
| Andon         |      43.77348 |       6.78596 |
| Caille        |      43.77887 |       6.72979 |
| Séranon       |      43.77435 |       6.70415 |
| Valderoure    |      43.79629 |       6.70749 |
+---------------+---------------+---------------+
le chapitre sur le formatage des chaînes de caractères pourrait aussi vous être utile !

Exercice 2 : vous devez produire le même affichage que dans l'exercice précédent, mais en utilisant le tuple de tuples suivant comme données d'entrée.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
data = (
    ("Andon", 43.77348, 6.78596),
    ("Caille", 43.77887, 6.72979),
    ("Séranon", 43.77435, 6.70415),
    ("Valderoure", 43.79629, 6.70749)
    # Vous ne devez pas présager du nombre de triplets.
)
Un tuple de tuple

Exercice 3 : écrire un programme qui calcule la somme et la valeur moyenne d'un tuple de données numériques. Oui, je sais, on a déjà fait cet exercice avec les listes, mais c'est juste histoire de vérifier que cela marche aussi avec les tuples.

Comme toujours, essayez de ne pas trop regarder les corrections avant d'avoir terminé chaque exercice. ;-)

Les corrections

Exercice 1 : voici comment afficher les données du tuple de coordonnées GPS.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
data = (
    "Andon", 43.77348, 6.78596,
    "Caille", 43.77887, 6.72979,
    "Séranon", 43.77435, 6.70415,
    "Valderoure", 43.79629, 6.70749
    # Vous ne devez pas présager du nombre de triplets.
)

cities = data[::3]
latitudes = data[1::3]
longitudes = data[2::3]

city_count = len(cities)

separator = f"+{'-' * 15}+{'-' * 15}+{'-' * 15}+"
header = f"| {'Ville':13s} | {'Latitude':>13s} | {'Longitude':>13s} |"

print(separator)
print(header)
print(separator)
for i in range(city_count):
    city = cities[i]
    lat = latitudes[i]
    long = longitudes[i]
    print(f"| {city:13s} | {lat:13.5f} | {long:13.5f} |")
print(separator)
Affichage sous forme de tableau de données présentes dans un tuple

Exercice 2 : voici comment afficher les données du tuple de tuples de coordonnées GPS.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
data = (
    ("Andon", 43.77348, 6.78596),
    ("Caille", 43.77887, 6.72979),
    ("Séranon", 43.77435, 6.70415),
    ("Valderoure", 43.79629, 6.70749)
    # Vous ne devez pas présager du nombre de triplets.
)

city_count = len(data)

separator = f"+{'-' * 15}+{'-' * 15}+{'-' * 15}+"
header = f"| {'Ville':13s} | {'Latitude':>13s} | {'Longitude':>13s} |"

print(separator)
print(header)
print(separator)
for city_data in data:
    city = city_data[0]
    lat = city_data[1]
    long = city_data[2]
    print(f"| {city:13s} | {lat:13.5f} | {long:13.5f} |")
print(separator)
Affichage sous forme de tableau de données présentes dans un tuple de tuples

Exercice 3 : voici donc comment calculer la somme et la moyenne d'un tuple de valeurs numériques.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
# Un jeu de données de démonstration
data = (10.1, 5.6, 8.3, 20.9, 17.2)

# On calcule la somme des valeurs et la moyenne
total = sum(data)
mean = total / len(data)

# On affiche les résultats
print(f"Total = {total:.2f}")
print(f"Mean = {mean:.2f}")
Calcule de la somme et de la moyenne d'un tuple de valeurs numériques


Manipulation de listes Manipulation de sets