Comparer [i j for i in range(1, 4) for j in range(1, 5)] et [[i j for…
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 4 — Les types construits · Tableaux, compréhensions et coût
Énoncé
Comparer [i <em> j for i in range(1, 4) for j in range(1, 5)] et [[i </em> j for j in range(1, 5)] for i in range(1, 4)]. Combien d'éléments chacune produit-elle, et de quelle forme ? Écrire enfin la compréhension qui aplatit une matrice.
Corrigé
plate = [i * j for i in range(1, 4) for j in range(1, 5)]
# [1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12] -- 12 valeurs, a plat
mat = [[i * j for j in range(1, 5)] for i in range(1, 4)]
# [[1, 2, 3, 4], [2, 4, 6, 8], [3, 6, 9, 12]] -- 3 lignes de 4 colonnes
La différence tient aux crochets, et à rien d'autre. Les deux exécutent les mêmes multiplications, dans le même ordre.
- Dans la première, les deux
forsont dans la même compréhension : chaque résultat est ajouté au même tableau. On obtient valeurs à plat. - Dans la seconde, la compréhension intérieure est l'expression de la compréhension extérieure : chaque tour de produit un tableau de valeurs. On obtient éléments, qui sont des tableaux.
len(plate) vaut ; len(mat) vaut et len(mat[0]) vaut .
L'aplatissement.
aplatie = [x for ligne in mat for x in ligne]
assert aplatie == plate # True
L'ordre de lecture est celui de deux boucles imbriquées écrites l'une après l'autre : d'abord for ligne in mat, puis for x in ligne. C'est le seul ordre possible, puisque ligne doit exister avant d'être parcourue — c'est ce qui permet de retrouver l'ordre sans le mémoriser.
L'écriture à ne jamais employer : [[i <em> j] for i in ...], avec des crochets autour de l'expression seule, produit un tableau de tableaux à un* élément chacun — douze tableaux d'une case. C'est rarement ce qu'on voulait, et cela ne provoque aucune erreur.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.