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.
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
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).
- a) Donner la valeur de
p[1].
- b) Expliquer pourquoi l'instruction
p[1] = 9provoque une erreur.
- c) Écrire une instruction qui affecte les trois valeurs de
paux variablesa,betc.
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] = 10remplace 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.
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.
- a) Donner la valeur de
t[0], det[3]et det[-1].
- b) Donner la valeur de
len(t).
- c) Écrire l'instruction qui remplace la valeur 8 par 10 dans
t.
É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 :
- a) le tableau des carrés des entiers de 1 à 10 ;
- b) le tableau des entiers pairs compris entre 0 et 30 inclus ;
- 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.
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]).
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].
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.
- a) Donner la valeur de
notes[1][2].
- b) Écrire une boucle qui calcule et affiche la moyenne de chaque élève.
- c) Écrire une instruction qui construit le tableau des moyennes de tous les élèves avec une compréhension.
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.
- a) Donner le contenu de
maprès cette instruction et expliquer ce phénomène.
- b) Proposer une construction correcte avec une compréhension.
- c) Écrire une fonction
transposee(m)qui renvoie la transposée d'un tableau de tableaux rectangulairem.
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 uneKeyError. -
d["Nantes"] = 320000ajoute une entrée (ou remplace la valeur si la clé existe déjà). -
"Lille" in dteste 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.
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.
- a) Donner la valeur de
d["Lyon"].
- b) Écrire l'instruction qui ajoute la ville de Nantes avec 320 000 habitants.
- c) Donner le résultat de
list(d.keys())avant l'ajout de Nantes.
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.
- a) Écrire une boucle qui affiche chaque produit avec sa quantité, en utilisant
items.
- b) Écrire une instruction qui calcule le nombre total de produits en stock, en utilisant
values.
- c) Écrire une fonction
vendre(stock, produit, n)qui retirenunités du produit si le stock est suffisant, et renvoieTrueouFalseselon que la vente a pu avoir lieu.
É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.
- a) Écrire la fonction.
- b) Donner le dictionnaire obtenu pour
"banane".
- c) Écrire une fonction
plus_frequente(d)qui prend un tel dictionnaire non vide et renvoie une lettre de fréquence maximale.
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.
- a) Écrire une fonction
plus_age(classe)qui renvoie le nom de l'élève le plus âgé.
- 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.
- c) Justifier que la complexité de
par_ageest linéaire en la taille declasse.
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 parx, y = f(). -
Un tableau
[a, b, c]est indexé de 0 àlen(t) - 1, modifiable, et se parcourt avecfor x in toufor 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 aveckeys(),values()etitems().