Tableaux par compréhension¶
Une particularité du langage Python est de proposer une syntaxe courte et élégante pour créer un tableau à partir d'un itérable, pour nous cela sera un tableau, une chaine de caractères ou l'utilisation de la fonction range.
En plus d'être synthétique, cette syntaxe est souvent plus rapide à l'exécution. Dans certains cas, elle jusqu'à deux fois plus rapide pour produire le même tableau.
Syntaxe [ exp for x in t ]¶
En utilsant un tableau existant.¶
Exemple
T1 = [1, 2, 3, 5]
print(T1)
T2 = [2 * x for x in T1]
print(T2)
T2 est construit par compréhension.
Ce programme affiche:
[1, 2, 3, 5]
[2, 4, 6, 10]
T2 contient les doubles des éléments du tableau T1
La syntaxe générale est:
[expr for x in t]
où:
- la paire de crochets, les mots-clefs
foretinsont obligatoires ; test un itérable, c'est-à-dire un tableau, une chaine de caractères ou l'utilisation de la fonctionrange;xest l’élément courant qui parcourtt;exprexpression qui dépend en général dexet dont la valeur est placée dans le tableau.
Comparaison compréhension et boucle for¶
Une liste en compréhension peut être remplacée par une boucle for mauis dans ce cas le code obtenu est plus long.
Exemple
Le premier exemple:
T1 = [1, 2, 3, 5]
T2 = [2 * x for x in T1]
print(T2)
forde la façon suivante:
T1 = [1, 2, 3, 5]
T2 = []
for x in T1:
T2.append(2 * x)
print(T2)
[2, 4, 6, 10]
En utilisant un itérable¶
En utilisant une chaine de caractères¶
Exemple
chaine = "test"
T = [ c * 2 for c in chaine]
print(T)
['tt', 'ee', 'ss', 'tt']
chaine répété deux fois.
En utilisant la fonction range¶
Exemple
T = [ x ** 2 for x in range(1,11)]
print(T)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Il est possible d'appeler une fonction lors de la création d'un tableau par compréhension.
Exemple
def f(x):
return 4 * x - 7
T = [f(x) for x in range(1,11)]
T contient les images des nombres entiers de 1 à 10 par la fonction définie sur \(\mathbb{R}\) par \(f(x) = 4x-7\)
Exemple
Créer un sous tableau en sélectionnant que certains indices
T = [3, 5, 7, 9, 11]
indice = [1,4 ]
T2 = [T[i] for i in indice]
T2 = [5, 11] car il est le tableau contenant les éléments d'indice 1 et 4 de T.
Filtrer des valeurs [ expr for x in t if expr2]¶
expr2est une expression qui dépend dex- Cette syntaxe permet de sélectionner les éléments de
tqui vérifieexpr2
Exemple
T = [1, 8, 12, 5, 15, 7]
T2 = [ x for x in T if x >= 10]
print(T2)
[12,15]
T2 contient les éléments x de T1 tels que x >= 10.
Remarque
On aurait pu écrire ce code en une ligne:
print([x for x in [1, 8, 12, 5, 15, 7] if x >= 10 ])
Le code équivalent avec une boucle for est:
T = [1, 8, 12, 5, 15, 7]
T2 = []
for elem in T:
if elem >= 10:
T2.append(elem)
print(T2)
[expr1 if expr_bool else expr2 for x in t]¶
expr_boolest une expression booléenne qui dépend dex- Si
expre_boolest évaluée àTruealorsexpr1est dans le tableau, sinon c'estexpr2
Exemple
T = [3,6,2,8,9]
T2 = ["Pair" if x % 2 == 0 else "Impair" for x in T]
T2 = ["Impair", "Pair", "Pair", "Pair", "Impair"].
T2 contient "Pair" aux indices ou les éléments de T sont pairs et "Impair" aux autres indices.
Tableaux par compréhension de deux itérables¶
Il est posssible de créer un tableau par compréhension à partir de deux itérables.
Exemple
T = [x + y for x in 'AB' for y in '123']
print(T)
['A1', 'A2', 'A3', 'B1', 'B2', 'B3']
'AB' puis en le concaténant avec chacun des éléments de la seconde chaine.
L'équivalent avec des boucles for serait:
T = []
for x in 'AB':
for y in '123':
T.append(x + y)
print(T)
Tableaux à deux dimensions par compréhension¶
Il est facile d'initialiser un tableau à deux dimensions par compréhension.
T = [[ 0 for j in range(3)] for i in range(2)]
print(T)
T[1][2] = 1
print(T)
[[0, 0, 0], [0, 0, 0]]
[[0, 0, 0], [0,0, 1]]
L'indice i parcourt les lignes et l'indice j parcourt les colonnes.
L'équivalent avec une boucle for est:
T = []
for i in range(2):
ligne = []
for j in range(3):
ligne.append(0)
T.append(ligne)
print(T)
Remarque
Il est possible d'imbriquer plus de deux tableaux, mais dans ce cas le code devient difficilement lisible.