Introduction

Un tableau (type List en Python), est une structure de données qui permet de stocker une collection ordonnée d’éléments de même type dans une seule variable. Son principal intérêt est de nous éviter de devoir créer une variable distincte pour chaque élément d’un ensemble.

  • Problème sans tableau : Pour gérer 5 notes par exemple, on serait contraint de créer 5 variables différentes (note1, note2, note3, …), rendant les opérations communes (comme calculer une moyenne) très laborieuses.
  • Solution avec un tableau : Une seule variable (notes) contient l’ensemble des données, ce qui permet de les traiter de manière collective et efficace via des boucles ; exemple :
les_notes = []                              #initialisation du tableau vide
saisie = input("Saisir une note : ")
while saisie != "":                         #tant qu'il y a une saisie
    les_notes.append(int(saisie))           #conversion et mémorisation
    saisie = input("Saisir une note : ")    #saisie de la note suivante

total = 0
for note in les_notes:
    total = total + note                    #algorithme du cumul
    print("Note : " + str(note) + ", Total : " + str(total))

if len(les_notes) != 0:                     #pour éviter une division par 0
    moyenne = round(total / len(les_notes), 2)
    print("Moyenne : " + str(moyenne))

Ce programme n’utilise qu’une seule variable les_notes, quel que soit le nombre de notes ;

  • à la première itération, les_notes = [] (tableau vide) ;
  • à la deuxième itération, les_notes = [14] (si l’utilisateur a saisit 14) ;
  • à la troisième itération, les_notes = [14, 12] (si l’utilisateur a saisit 12) ;

Opération de base

Création et initialisation

Création d’un tableau vide ; les crochets ([ et ]) marquent le début et la fin d’un tableau :

nomTableau = []

Il est possible d’initialiser le contenu d’un tableau en énumérant ses éléments séparés par des virgules ; exemples :

notes = [12, 15, 9, 18]  #collection de notes (entiers)
mots = ["bonjour", "le", "monde"]  #collection de mots (chaînes de caractères)

Nombre d’éléments

La fonction len(nomTableau) renvoie le nombre d’éléments du tableau ; exemple

fruits = ["banane", "mangue", "passion"]
nb_elements = len(fruits)
print("Nombre de fruits : " + str(nb_elements))
#ou: print("Nombre de fruits : " + str(len(fruits)))

Extraction d’un élément ou sous-tableau

Il est possible d’extraire un élément ou un sous-tableau d’un tableau, exactement comme avec les chaînes de caractères ; rappel, les indices vont de 0 à len(tableau) - 1 ; exemple :

fruits = ["banane", "mangue", "papaye", "ananas", "passion"]
print(fruits[4])   #élément
print(fruits[1:3]) #sous-tableau

Tableaux, chaînes et tuples

Comme une chaîne est une séquence de caractères, un tableau est une séquence d’éléments. En Python, la différence majeure est que les tableaux sont mutables (modifiables) : on peut ajouter, supprimer ou changer leurs éléments après leur création, contrairement aux chaînes qui sont immuables ; par exemple, ch = ch + "..." crée une nouvelle chaîne (qui écrase l’ancienne).

Points d’attention :

  • L’usage premier d’un tableau est de gérer une collection d’éléments de même type.
  • Les tableaux Python sont dynamiques : leur taille s’ajuste automatiquement lorsque vous ajoutez ou supprimez des éléments ; ce n’est pas le cas dans tous les langages de programmation.

Les tuples sont des tableaux immuables (non modifiables). Ils sont créés avec des parenthèses à la place des crochets ; exemple :

jours = ("lundi", "mardi", "…", "dimanche")

Modification de tableau

Un tableau peut être modifié par l’ajout ou la suppression d’éléments.

Ajout d’éléments

Deux méthodes permettent d’ajouter des éléments au tableau :

  • Ajout en fin de tableau avec nomTableau.append(valeur) ; exemple :
fruits = ["banane", "mangue"]
fruits.append("ananas")
print(fruits)

Remarque : l’opération append est au tableau ce que la concaténation + est à une chaîne de caractères.

  • Insertion à un index précis avec nomTableau.insert(valeur, index) ; exemple :
fruits = ["banane", "mangue"]
fruits.insert(1, "ananas")
print(fruits)

Remarque : cette méthode nécessite de décaler d’une position vers la droite les éléments à partir de l’index d’insertion (pour faire un “trou”), ce qui la rend moins efficace que l’ajout à la fin.

Suppression d’éléments

Il y a trois méthodes principales pour supprimer un élément :

  • Suppression du dernier élément valeur = nomTableau.pop() cette méthode supprime et renvoie le dernier élément du tableau ; exemple :
fruits = ["banane", "mangue", "papaye", "ananas"]
dernierFruit = fruits.pop()
print(dernierFruit)
print(fruits)
  • Suppression d’un élément à un index précis avec valeur = nomTableau.pop(index) ; comme pour l’insertion, cette méthode nécessite de décaler vers la gauche les éléments suivant l’index (pour boucher le “trou”) ; exemple :
fruits = ["banane", "mangue", "papaye", "ananas"]
troisiemeFruit = fruits.pop(2)
print(troisiemeFruit)
print(fruits)
print(str(len(fruits)))
  • Suppression par valeur avec nomTableau.remove(valeur) ; cette méthode supprime la première occurrence de la valeur dans le tableau ;
fruits = ["banane", "mangue", "banane", "ananas"]
fruits.remove("banane")
print(fruits) #il reste une banane

Attention : les méthodes pop et remove lèvent une exception ValueError si l’indice (index) est invalide ou si la valeur n’est pas dans le tableau.

Parcours d’un tableau

Le parcours d’un tableau est une opération fondamentale, permettant d’accéder à chacun de ses éléments pour les traiter. Les méthodes de parcours analogues à celles utilisées pour les chaînes de caractères.

Parcours direct, par élément

Le parcours direct, “pour chaque valeur du tableau" : for valeur in nomTableau: ; exemple :

fruits = ["banane", "mangue", "papaye", "ananas"]
for fruit in fruits:
    print(fruit)

Parcours avec indice :

Le parcours avec indice, “pour chaque indice du tableau" : for i in range(len(tableau)) ; exemple :

fruits = ["banane", "mangue", "papaye", "ananas"]
for i in range(len(fruits)):
    fruit = fruits[i]
    print(str(i) + " : " + fruit)

Le parcours avec indice est également possible avec l’itérative while :

i = 0
while i < len(fruits):
    fruit = fruits[i]
    print(str(i) + " : " + fruit)
    i = i + 1

Points d’attention :

  • Le parcours par élément est généralement plus simple et lisible. Utiliser le parcours par indice seulement s’il est nécessaire de connaître la position des éléments, ou dans une itérative while.
  • Ne pas modifier le tableau pendant son parcours. Si besoin, utiliser un deuxième tableau.

Algorithmes classiques

Ces algorithmes de parcours permettent de résoudre des problèmes récurrents.

Exemple de compte et cumul

notes = [12, 15, 9, 18, 15]
compte = 0
total = 0
for note in notes:
    compte = compte + 1
    total = total + note
moyenne = None if compte == 0 else round(total / compte, 2)
print("La moyenne est : " + str(moyenne))

Exemple de recopie

notes = [12, 11, 9, 18, 15]
bonnes_notes = []
for note in notes:
    if note >= 12:
        bonnes_notes.append(note)
print(bonnes_notes)

Recherche

  • Première version :
fruits = ["banane", "mangue", "papaye", "ananas", "passion"]
fruit_recherche = input("Saisir le nom d'un fruit : ")

found = False
i = 0

while not found and i < len(fruits):
    if fruits[i] == fruit_recherche:
        found = True
    else:
        i = i + 1

if found:
    print(fruit_recherche + " trouvé à l'indice " + str(i))
else:
    print(fruit_recherche + " non trouvé")
  • Autre écriture équivalente :
fruits = ["banane", "mangue", "papaye", "ananas", "passion"]
fruit_recherche = input("Saisir le nom d'un fruit : ")

i = 0
while i < len(fruits) and fruits[i] != fruit_recherche:
    i = i + 1

print("-1" if i == len(fruits) else str(i))

Fonctions utiles

Fonction index

La fonction nomTableau.index(valeur) renvoie l’indice de la première occurrence de la valeur, et lève une exception si elle n’est pas trouvée ; exemple :

fruits = ["banane", "mangue", "papaye", "ananas", "passion"]
fruit_recherche = input("Saisir le nom d'un fruit : ")
try:               #pour contenir une instruction qui peut échouer
    i = fruits.index("bananed")
    print(fruit_recherche + " trouvé à l'indice " + str(i))
except ValueError: #pour capturer l'erreur
    print(fruit_recherche + " non trouvé")

Opérateur in

Si on souhaite seulement savoir si une valeur est présente dans un tableau, on peut utiliser l’opérateur in :

fruits = ["banane", "mangue", "papaye", "ananas", "passion"]
fruit_recherche = input("Saisir le nom d'un fruit : ")
if fruit_recherche in fruits:
    print(fruit_recherche + " trouvé")
else:
    print(fruit_recherche + " non trouvé")

Fonctions join et split

Les méthodes chaine = separateur.join(tableau) et tableau = chaine.split(separateur) permettent de convertir une chaîne de caractères en tableau et inversement. Exemples :

phrase = "Iaorana la Polynésie"
mots = phrase.split(" ")
for mot in mots:
    print(mot)
fusion = "-".join(mots) #attention: contre-intuitif
print(fusion)

Tri

Il est parfois nécessaire d’ordonner les éléments d’un tableau. Ici encore, deux approches sont possibles :

  • Tri en place avec nomTableau.sort() ; cette méthode modifie le tableau original en ordonnant ses éléments par ordre croissant ; exemple :
nombres = [3, 1, 4, 1, 5]
nombres.sort()
print(nombres)

Pour trier par ordre décroissant, utiliser la méthode reverse ; exemple :

nombres = [3, 1, 4, 1, 5]
nombres.sort()
nombres.reverse() #à faire en deux opérations (sort puis reverse)
print(nombres)
  • Création d’un tableau trié avec nouveauTableau = sorted(nomTableau) ; cette méthode ne modifie pas le tableau original, mais renvoie un nouveau tableau trié ; exemple :
nombres = [3, 1, 4, 1, 5]
nombres_tries = sorted(nombres)
print(nombres)
print(nombres_tries)

Pour trier par ordre décroissant, c’est possible en une seule opération avec le “slicing” [::-1] ; exemple :

nombres = [3, 1, 4, 1, 5]
nombres_tries_inverses = sorted(nombres)[::-1]
print(nombres_tries_inverses)

Attention : le tri une opération coûteuse (en temps de calcul) ; par exemple, pour trier 1000 éléments, il faut faire 10000 comparaisons.