Adloun

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.

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.