mathématiques appliquées (ECG 1re année) · Chapitre 11 · Application directe du cours
Compter et localiser
Informatique et algorithmique · Boucles et listes · niveau 1 (application)
Énoncé
Écrire compte_pairs(L) qui renvoie le nombre d'éléments pairs d'une liste d'entiers, puis positions(L, x) qui renvoie la liste de tous les indices où x apparaît.
Corrigé
Le code.
def compte_pairs(L):
c = 0
for x in L:
if x % 2 == 0:
c = c + 1
return c
def positions(L, x):
P = []
for i in range(len(L)): # on parcourt les INDICES, pas les valeurs
if L[i] == x:
P.append(i)
return P
print(compte_pairs([3, 8, 4, 7, 10])) # 3
print(positions([5, 2, 5, 9, 5], 5)) # [0, 2, 4]
print(positions([5, 2, 5, 9, 5], 7)) # []
Le test de parité. x % 2 est le reste de la division euclidienne de x par : il vaut si et seulement si x est pair. Le test fonctionne aussi pour les entiers négatifs en Python, où -4 % 2 vaut .
Pourquoi parcourir les indices dans la seconde fonction. La boucle for x in L donne les valeurs, et l'on ne saurait pas où elles se trouvent. Comme on cherche des positions, il faut parcourir range(len(L)) et accéder à L[i].
Le cas où x est absent. La liste P reste vide et la fonction rend []. C'est le comportement souhaitable : rendre None ou obligerait l'appelant à distinguer deux types de réponses, alors qu'une liste vide se traite comme n'importe quelle autre — par exemple avec len(positions(L, x)), qui compte les occurrences.
Le coût. Chaque fonction fait un seul parcours, soit de l'ordre de opérations.
Exercices semblables
- Somme et moyenne d'une liste corrigé
- Renverser une liste, tester un palindrome corrigé
- Une dichotomie et son nombre de tours corrigé
- Une suite récurrente en Python corrigé
- Lire un graphe corrigé