Retour à la page d'accueilNSI · Première (sans spé maths) · Changer de matière
Commencer gratuitement
Première (sans spé maths) · NSI
Types construits et algorithmique en première NSI · Types construits en Python

p-uplets, tableaux et dictionnaires

Tu veux ranger les notes d'une classe, les habitants des grandes villes de France ou les coordonnées d'un point. Un entier ou une chaîne ne suffisent plus : il faut regrouper plusieurs valeurs dans une seule variable. Python propose pour cela trois types construits. Comment choisir le bon, et comment s'en servir sans piège ?

Les p-uplets : des valeurs regroupées et figées

Un p-uplet (en Python, tuple) regroupe plusieurs valeurs entre parenthèses, séparées par des virgules : p = (3, 7, 11). On accède à un élément par son indice, qui commence à 0 : p[0] vaut 3, p[1] vaut 7.

Un p-uplet est immuable : on ne peut pas modifier un élément après la création. L'instruction p[1] = 9 provoque une erreur TypeError. C'est utile quand les valeurs forment un tout qui ne doit pas changer, comme les coordonnées d'un point ou une date.

Un p-uplet de trois valeurs avec ses indices 0, 1 et 2 3 7 11 indice 0 indice 1 indice 2 p = (3, 7, 11)

Une fonction peut renvoyer un p-uplet pour rendre plusieurs résultats à la fois. On récupère ensuite les valeurs par affectation multiple :

def min_max(t):

    return (min(t), max(t))

a, b = min_max([12, 5, 8])   # a vaut 5, b vaut 12
Entraîne-toi★☆☆Pas commencé
On définit le p-uplet p = (3, 7, 11). a) Donner la valeur de p[1]. b) Expliquer pourquoi l'instruction p[1] = 9 provoque une erreur. c) Écrire une instruction qui…

On définit le p-uplet p = (3, 7, 11).

  1. a) Donner la valeur de p[1].
  1. b) Expliquer pourquoi l'instruction p[1] = 9 provoque une erreur.
  1. c) Écrire une instruction qui affecte les trois valeurs de p aux variables a, b et c.
Résoudre

Les tableaux : indexer, modifier, parcourir

Un tableau (en Python, une list) est une suite ordonnée de valeurs, entre crochets : t = [12, 5, 8, 20, 7]. Dans le programme de première, on utilise des tableaux dont tous les éléments sont du même type.

  • t[0] vaut 12 : le premier élément a l'indice 0.

  • t[-1] vaut 7 : l'indice négatif compte depuis la fin.

  • len(t) vaut 5 : c'est le nombre d'éléments. Les indices valides vont de 0 à len(t) - 1.

  • Contrairement au p-uplet, un tableau est modifiable : t[2] = 10 remplace 8 par 10.

  • t.append(3) ajoute 3 à la fin.

Pour parcourir un tableau, deux boucles sont possibles :

for x in t:                    # on lit directement les éléments

    print(x)

for i in range(len(t)):        # on passe par les indices

    t[i] = t[i] + 1

La seconde est nécessaire quand on veut modifier les éléments ou connaître leur position.

Construire un tableau par compréhension

Une compréhension décrit un tableau en une ligne, comme on décrit un ensemble en mathématiques :

carres = [x * x for x in range(1, 6)]            # [1, 4, 9, 16, 25]

pairs  = [x for x in range(0, 11) if x % 2 == 0]  # [0, 2, 4, 6, 8, 10]

Le schéma est [expression for x in séquence if condition]. La condition est facultative : elle filtre les éléments conservés, l'expression transforme ceux qui restent. Rappelle-toi que range(a, b) s'arrête avant b.

Entraîne-toi★☆☆Pas commencé
On considère le tableau t = [12, 5, 8, 20, 7] en Python. a) Donner la valeur de t[0], de t[3] et de t[-1]. b) Donner la valeur de len(t). c) Écrire l'instruction qui…

On considère le tableau t = [12, 5, 8, 20, 7] en Python.

  1. a) Donner la valeur de t[0], de t[3] et de t[-1].
  1. b) Donner la valeur de len(t).
  1. c) Écrire l'instruction qui remplace la valeur 8 par 10 dans t.
Résoudre
Entraîne-toi★★☆Pas commencé
Écrire en Python, avec une compréhension de tableau : a) le tableau des carrés des entiers de 1 à 10 ; b) le tableau des entiers pairs compris entre 0 et 30 inclus ; c)…

Écrire en Python, avec une compréhension de tableau :

  1. a) le tableau des carrés des entiers de 1 à 10 ;
  1. b) le tableau des entiers pairs compris entre 0 et 30 inclus ;
  1. c) à partir de notes = [12, 8, 15, 9, 17, 11], le tableau des notes supérieures ou égales à 10, augmentées chacune d'un point.
Résoudre

Tableaux de tableaux : les matrices

Pour représenter une grille ou une matrice, on utilise un tableau de tableaux : chaque élément est lui-même un tableau, qui représente une ligne.

notes = [[12, 15, 9],

         [8, 11, 14],

         [16, 13, 17]]

notes[i] est la ligne i, et notes[i][j] est l'élément de la ligne i et de la colonne j. Ici notes[1][2] vaut 14. Le nombre de lignes est len(notes), le nombre de colonnes len(notes[0]).

Un tableau de tableaux à trois lignes et trois colonnes avec l'élément notes[1][2] mis en évidence 12159 81114 161317 col. 0col. 1col. 2 ligne 0ligne 1ligne 2 case colorée : notes[1][2]

Pour parcourir toute la matrice, on imbrique deux boucles. Pour calculer la moyenne de chaque ligne :

for ligne in notes:

    print(sum(ligne) / len(ligne))

Avec une compréhension : moyennes = [sum(l) / len(l) for l in notes].

Entraîne-toi★★☆Pas commencé
Un professeur du lycée Camille Claudel à Paris range les notes de trois élèves dans un tableau de tableaux : notes = [[12, 15, 9], [8, 11, 14], [16, 13, 17]], chaque…

Un professeur du lycée Camille Claudel à Paris range les notes de trois élèves dans un tableau de tableaux :

notes = [[12, 15, 9], [8, 11, 14], [16, 13, 17]], chaque ligne correspondant à un élève.

  1. a) Donner la valeur de notes[1][2].
  1. b) Écrire une boucle qui calcule et affiche la moyenne de chaque élève.
  1. c) Écrire une instruction qui construit le tableau des moyennes de tous les élèves avec une compréhension.
Résoudre
Entraîne-toi★★★Pas commencé
On souhaite créer un tableau de 3 lignes et 4 colonnes rempli de zéros. Un élève propose : m = [[0] * 4] * 3 puis exécute m[0][1] = 5. a) Donner le contenu de m après…

On souhaite créer un tableau de 3 lignes et 4 colonnes rempli de zéros. Un élève propose :

m = [[0] * 4] * 3

puis exécute m[0][1] = 5.

  1. a) Donner le contenu de m après cette instruction et expliquer ce phénomène.
  1. b) Proposer une construction correcte avec une compréhension.
  1. c) Écrire une fonction transposee(m) qui renvoie la transposée d'un tableau de tableaux rectangulaire m.
Résoudre

Les dictionnaires : des clés et des valeurs

Dans un tableau, on repère un élément par sa position. Mais pour retrouver la population de Lyon, un nom est plus parlant qu'un numéro. Un dictionnaire associe à chaque clé une valeur :

d = {"Paris": 2161000, "Lyon": 522000, "Lille": 236000}
  • d["Lyon"] vaut 522 000. Une clé absente provoque une KeyError.

  • d["Nantes"] = 320000 ajoute une entrée (ou remplace la valeur si la clé existe déjà).

  • "Lille" in d teste la présence d'une clé.

  • len(d) donne le nombre d'entrées.

Les clés sont uniques et doivent être de type non modifiable : on utilise des chaînes, des entiers ou des p-uplets de valeurs non modifiables, pas des tableaux.

Parcourir un dictionnaire

Méthode Ce qu'elle donne
d.keys() les clés
d.values() les valeurs
d.items() les couples (clé, valeur)
for ville, hab in d.items():

    print(ville, hab)

total = sum(d.values())

Une boucle for c in d: parcourt directement les clés.

d.keys() ne s'affiche pas comme un tableau : pour obtenir un vrai tableau des clés, on le convertit avec list. Les clés sont rangées dans l'ordre d'insertion. Par exemple, avec notes_ds = {"Hugo": 14, "Inès": 11}, list(notes_ds.keys()) vaut ['Hugo', 'Inès'] et list(notes_ds.values()) vaut [14, 11].

Dictionnaire et enregistrement

Un dictionnaire peut représenter un p-uplet nommé (enregistrement) : eleve = {"nom": "Martin", "prenom": "Léa", "age": 16}. Chaque champ a un nom, ce qui est plus lisible qu'un indice. Une liste de tels dictionnaires forme une petite base de données.

Un dictionnaire sert aussi à regrouper : pour une liste de dictionnaires classe, on peut construire {age: [noms]} en un seul parcours.

Remarque : chaque élément est traité une seule fois, avec un accès au dictionnaire en temps constant ; le coût est donc proportionnel à la taille de classe.

Entraîne-toi★☆☆Pas commencé
On considère le dictionnaire d = {"Paris": 2161000, "Lyon": 522000, "Lille": 236000} qui associe à une ville son nombre d'habitants. a) Donner la valeur de d["Lyon"]. b)…

On considère le dictionnaire d = {"Paris": 2161000, "Lyon": 522000, "Lille": 236000} qui associe à une ville son nombre d'habitants.

  1. a) Donner la valeur de d["Lyon"].
  1. b) Écrire l'instruction qui ajoute la ville de Nantes avec 320 000 habitants.
  1. c) Donner le résultat de list(d.keys()) avant l'ajout de Nantes.
Résoudre
Entraîne-toi★★☆Pas commencé
Le dictionnaire stock = {"baguette": 40, "croissant": 25, "pain au chocolat": 30} représente le stock d'une boulangerie de Toulouse. a) Écrire une boucle qui affiche…

Le dictionnaire stock = {"baguette": 40, "croissant": 25, "pain au chocolat": 30} représente le stock d'une boulangerie de Toulouse.

  1. a) Écrire une boucle qui affiche chaque produit avec sa quantité, en utilisant items.
  1. b) Écrire une instruction qui calcule le nombre total de produits en stock, en utilisant values.
  1. c) Écrire une fonction vendre(stock, produit, n) qui retire n unités du produit si le stock est suffisant, et renvoie True ou False selon que la vente a pu avoir lieu.
Résoudre
Entraîne-toi★★★Pas commencé
Écrire une fonction frequences(texte) qui prend en paramètre une chaîne de caractères et renvoie un dictionnaire associant à chaque lettre son nombre d'occurrences. a)…

Écrire une fonction frequences(texte) qui prend en paramètre une chaîne de caractères et renvoie un dictionnaire associant à chaque lettre son nombre d'occurrences.

  1. a) Écrire la fonction.
  1. b) Donner le dictionnaire obtenu pour "banane".
  1. c) Écrire une fonction plus_frequente(d) qui prend un tel dictionnaire non vide et renvoie une lettre de fréquence maximale.
Résoudre
Entraîne-toi★★★Pas commencé
Un p-uplet nommé est représenté par un dictionnaire : eleve = {"nom": "Martin", "prenom": "Léa", "age": 16}. On dispose d'une liste classe de tels dictionnaires. a)…

Un p-uplet nommé est représenté par un dictionnaire : eleve = {"nom": "Martin", "prenom": "Léa", "age": 16}. On dispose d'une liste classe de tels dictionnaires.

  1. a) Écrire une fonction plus_age(classe) qui renvoie le nom de l'élève le plus âgé.
  1. b) Écrire une fonction par_age(classe) qui renvoie un dictionnaire dont les clés sont les âges et les valeurs les listes des noms des élèves de cet âge.
  1. c) Justifier que la complexité de par_age est linéaire en la taille de classe.
Résoudre

Choisir le bon type

Besoin Type conseillé
Valeurs fixes qui forment un tout (point, date), résultats multiples d'une fonction p-uplet
Suite de valeurs de même nature que l'on lit, modifie, parcourt tableau
Grille, matrice, image tableau de tableaux
Retrouver une valeur à partir d'un nom ou d'un code dictionnaire

Vers le début du chapitre : pour les notes d'une classe, on utilise un tableau (ou un tableau de tableaux) ; pour les habitants des villes, un dictionnaire ; pour des coordonnées, un p-uplet.

L'essentiel

  • Un p-uplet (a, b, c) est indexé à partir de 0 et immuable ; une fonction peut en renvoyer un, et on l'affecte par x, y = f().

  • Un tableau [a, b, c] est indexé de 0 à len(t) - 1, modifiable, et se parcourt avec for x in t ou for i in range(len(t)).

  • Une compréhension [expr for x in seq if cond] construit un tableau en une ligne.

  • Un tableau de tableaux représente une matrice : m[i][j] est la ligne i, colonne j. Ne jamais écrire [[0] * p] * n.

  • Un dictionnaire {clé: valeur} associe des valeurs à des clés uniques ; on le parcourt avec keys(), values() et items().

Voir tous les exercices de cette partie