Première · Tableaux, textes et dictionnaires

Construire des tableaux par compréhension

Construire une liste de carrés ou conserver les mesures dépassant un seuil peut se décrire en une expression. La compréhension rend explicites trois questions : quelles valeurs parcourir, lesquelles garder et quelle valeur produire pour chacune.

SofienAvec SofienIngénieur et enseignant en informatique
Dans ce chapitre

Un cap pour ce chapitre

Ce que vous saurez faire

  • Lire une compréhension dans l’ordre logique
  • Construire un tableau transformé avec ou sans filtre
  • Traduire une compréhension en parcours explicite
Les bases utiles pour commencer

Produire une valeur pour chaque entrée

L’expression [x * x for x in range(5)] construit le tableau [0, 1, 4, 9, 16]. Même si le calcul apparaît à gauche dans la syntaxe, on lit d’abord le parcours : x prend les valeurs de range(5). Pour chacune, on évalue x * x et on ajoute ce résultat au nouveau tableau. La compréhension ne demande pas de changer range ni de modifier une case existante. Elle construit un résultat à partir d’une règle. Commencez par des exemples courts afin de pouvoir vérifier chaque association entrée-sortie.

La règle peut utiliser la valeur directement ou calculer une nouvelle valeur. Sans condition, chaque entrée produit exactement une sortie. La longueur est donc prévisible avant le calcul, même lorsque plusieurs entrées donnent le même résultat.

Filtrer avant de produire

Une condition placée après le parcours sélectionne les entrées retenues. Dans [x * x for x in valeurs if x > 0], les valeurs positives sont gardées, puis leur carré est produit. Pour valeurs = [-3, 0, 2, 5], le résultat est [4, 25]. Il faut distinguer la condition portant sur x et une condition portant sur le résultat transformé. Filtrer les x positifs ne donne pas la même chose que conserver les carrés positifs, puisque le carré d’un entier négatif est lui aussi positif.

Le filtre décide si une entrée produit quelque chose, sans remplacer les entrées refusées par zéro. Un tableau résultat plus court conserve donc seulement les éléments sélectionnés, dans leur ordre initial. Cela diffère d’une transformation qui conserverait toutes les positions.

Retrouver la boucle derrière l’expression

Une compréhension peut se développer en un parcours qui construit progressivement un tableau résultat. Cette traduction aide à expliquer une expression et à la déboguer. Dans les exercices, on peut suivre une table avec valeur lue, test, valeur produite et tableau partiel. Une compréhension devrait rester lisible : si la règle demande de nombreux cas, plusieurs étapes ou des effets sur d’autres données, une fonction et une boucle explicite peuvent mieux exprimer le traitement. L’objectif n’est pas de condenser le plus de code possible sur une ligne.

valeurs = [-3, 0, 2, 5]
carres_positifs = [x * x for x in valeurs if x > 0]

La table de trace doit séparer les colonnes « entrée », « condition » et « production ». Pour une entrée refusée, la production est absente, et non nulle. Une compréhension avec plusieurs effets ou de nombreuses conditions doit être décomposée pour rester explicable.

Vérifier taille, ordre et absence de modification

Sans filtre, le résultat contient autant d’éléments que le parcours. Avec un filtre, il peut en contenir moins, éventuellement aucun. L’ordre du parcours est conservé pour les éléments retenus : une compréhension ne trie pas automatiquement ses résultats. Elle ne supprime pas non plus les doublons, sauf si la règle le prévoit par un autre mécanisme. Dans nos exemples d’entiers, le tableau d’origine reste inchangé. Ces propriétés permettent d’anticiper le résultat avant de calculer chaque valeur et de repérer une réponse qui ne peut pas être correcte.

Avec un tableau vide, une compréhension à un seul parcours produit naturellement un tableau vide. Avec un filtre toujours faux, le résultat est également vide, mais pour une autre raison. Comparer ces deux situations permet de distinguer absence d’entrée et rejet de toutes les entrées.

La condition porte sur une étape déterminée

Pour [-3, -1, 0, 2], l’expression [x * x for x in t if x > 0] produit [4]. Si l’on filtre plutôt les carrés strictement positifs, les entrées moins trois et moins un conviennent aussi : le résultat devient [9, 1, 4]. Le carré transforme le signe et peut donc changer la signification d’un critère de positivité.

Avant d’écrire la condition, formulez précisément la question : sélectionner des mesures positives puis les mettre au carré, ou sélectionner les mesures dont le carré est positif. Les deux formulations utilisent les mêmes opérations, mais ne sélectionnent pas les mêmes données.

Produire les positions plutôt que les valeurs

On cherche les indices des notes atteignant douze dans [9, 14, 12, 8, 14]. Le parcours doit porter sur range(len(notes)), la condition sur notes[i] >= 12 et la production sur i. Le résultat est [1, 2, 4]. Si la production devient notes[i], on obtient les notes [14, 12, 14].

Les deux résultats ont ici la même longueur mais un sens différent. Choisir la variable de parcours selon le résultat demandé évite de reconstruire ensuite des indices à partir de valeurs répétées. Les deux occurrences de quatorze possèdent des positions distinctes qu’il faut conserver.

À vous de faire varier les choses

Suivez chaque valeur jusqu’au résultat

Choisissez la transformation et le filtre. Observez les éléments refusés et la manière dont les valeurs retenues sont transformées.

Lire le résultat de l’expérience initiale

Résultat : [4, 25]

Le tableau initial reste [-3, -2, 0, 2, 5]. Le filtre porte sur x avant sa transformation.

Entrée xFiltreValeur produite
-3ExcluAucune production
-2ExcluAucune production
0ExcluAucune production
2Retenu4
5Retenu25

La table de correspondance révèle la différence entre sélectionner une entrée et transformer sa valeur.

De la compréhension à l’autonomie

À vous de résoudre

Cherchez d’abord par vous-même. Vérifiez les résultats demandés, utilisez les indices si nécessaire, puis comparez votre méthode à la correction.

Exercice 1 · S’entraîner#

Lire une transformation

Donnez le résultat de [2 * x + 1 for x in range(4)]. Expliquez le nombre d’éléments obtenu.

Indice 1

range(4) parcourt 0, 1, 2 et 3.

Indice 2

Calculez l’expression une fois pour chaque valeur.

Comprendre la correction

Les résultats sont 1, 3, 5 et 7, donc le tableau construit est [1, 3, 5, 7]. Il contient quatre éléments parce que le parcours possède quatre valeurs et qu’aucun filtre n’en exclut. Le dernier résultat 7 ne signifie pas que range a parcouru jusqu’à 7.

Exercice 2 · S’entraîner#

Filtrer puis transformer

Pour t = [-2, 3, 0, 5, -1], calculez [x + 10 for x in t if x > 0].

Indice 1

La condition est évaluée sur la valeur initiale x.

Indice 2

Les valeurs retenues sont 3 et 5.

Comprendre la correction

Les valeurs positives 3 et 5 produisent respectivement 13 et 15. Le résultat est [13, 15]. Les valeurs - 2, 0 et -1 sont exclues avant la transformation ; le fait que leur somme avec 10 serait positive ne change pas le critère effectivement écrit.

Exercice 3 · S’entraîner#

Des doublons qui restent

Un élève attend [1, 4] pour [x * x for x in [-2, -1, 1, 2]]. Pourquoi cette réponse est-elle incorrecte ?

Indice 1

Aucune condition ne supprime une entrée.

Indice 2

Deux entrées différentes peuvent produire le même résultat.

Comprendre la correction

Le résultat réel est [4, 1, 1, 4]. Il respecte l’ordre des quatre entrées et conserve une production par entrée. Une compréhension ne déduplique pas et ne trie pas automatiquement. Pour attendre [1, 4], il faudrait annoncer d’autres opérations, qui ne figurent pas dans cette expression.

Exercice 4 · S’entraîner#

Construire une règle

Écrivez une compréhension donnant les indices des éléments strictement supérieurs à 10 dans t = [8, 14, 10, 17].

Indice 1

Le résultat demandé contient des positions, pas les valeurs 14 et 17.

Indice 2

Parcourez range(len(t)) et testez t[i].

Comprendre la correction

On écrit [i for i in range(len(t)) if t[i] > 10]. Le résultat est [1, 3]. La valeur 10 à l’indice 2 est exclue car la comparaison est stricte. Écrire [x for x in t if x > 10] donnerait [14, 17], qui répond à une autre question.

Exercice 5 · Approfondir et relier#

Sélectionner avant ou après le carré

Avec t = [-3, -1, 0, 2], calculez [x*x for x in t if x > 0] puis [x*x for x in t if x*x > 0]. Expliquez chaque exclusion et indiquez si le tableau original change.

Indice 1

Un nombre négatif peut avoir un carré positif.

Indice 2

Zéro reste nul après multiplication par lui-même.

Comprendre la correction

La première expression retient seulement deux et donne [4]. La seconde retient moins trois, moins un et deux, donnant [9, 1, 4]. Zéro est exclu dans les deux cas. Les compréhensions construisent de nouveaux tableaux ; le tableau original reste identique. Le critère porte sur des expressions différentes.

Exercice 6 · Approfondir et relier#

Des alertes localisées

Pour t = [8, 13, 11, 16, 13], écrivez une compréhension donnant les indices des valeurs strictement supérieures à douze. Donnez ensuite celle produisant les valeurs elles-mêmes et comparez leurs résultats.

Indice 1

Une production d’indice doit parcourir les positions.

Indice 2

Les deux occurrences de treize doivent être conservées.

Comprendre la correction

Les indices s’obtiennent avec [i for i in range(len(t)) if t[i] > 12], soit [1, 3, 4]. Les valeurs s’obtiennent avec [x for x in t if x > 12], soit [13, 16, 13]. La répétition de treize ne supprime aucune entrée ; chaque occurrence répond au critère.

Exercice 7 · Approfondir et relier#

Un filtre qui conserve zéro

On transforme [-4, -1, 0, 3, 4] en doublant seulement les nombres pairs. Écrivez la compréhension, donnez le tableau produit et expliquez le traitement de zéro et des négatifs. Quelle longueur maximale peut avoir le résultat ?

Indice 1

Un entier pair possède un reste nul dans la division par deux.

Indice 2

Le filtre ne dépend pas du signe.

Comprendre la correction

L’expression [2*x for x in t if x % 2 == 0] produit [-8, 0, 8]. Moins quatre et zéro sont pairs, donc retenus. Le résultat possède trois éléments et ne peut jamais dépasser cinq éléments pour ce parcours : chaque entrée produit au maximum une sortie.

Les erreurs qui méritent un détour

Lire le calcul avant de connaître la valeur parcourue
Lisez mentalement le parcours, puis le filtre, puis l’expression produite.
Attendre un tri ou une suppression automatique des doublons
La compréhension conserve l’ordre et produit une valeur pour chaque entrée retenue.

La fiche à garder

L’essentiel à retenir

  • Une compréhension construit un nouveau tableau.
  • Le filtre porte sur l’expression réellement écrite.
  • Valeurs et indices demandent des parcours différents.

Le prochain pas

Retrouver le catalogue de Première

Ce chapitre s’appuie sur le programme officiel de Première (PDF, nouvel onglet). Les explications et exercices sont proposés pour l’apprentissage.