Écrire indices des(t, v) , qui renvoie le tableau de tous les indices…
Exercice de TD · niveau 2 · NSI (première), chapitre 4 — Les types construits · Tableaux et compréhensions
Énoncé
Écrire indices_des(t, v), qui renvoie le tableau de tous les indices où v apparaît dans t. Pourquoi la compréhension doit-elle ici porter sur les indices et non sur les éléments ?
Corrigé
def indices_des(t, v):
"""Tableau des indices i tels que t[i] == v, par ordre croissant.
Postcondition : t[i] == v pour tout i du resultat, et le nombre
d'indices rendus est le nombre d'occurrences de v.
"""
return [i for i in range(len(t)) if t[i] == v]
Pourquoi les indices. C'est exactement le critère de la méthode du cours : on parcourt par élément quand seule la valeur compte, par indice quand la position compte. Ici la position est le résultat même — écrire [x for x in t if x == v] rendrait un tableau de v répétés, ce qui n'apprend rien.
Vérification.
assert indices_des([3, 1, 3, 3, 2], 3) == [0, 2, 3]
assert indices_des([3, 1, 3], 9) == []
assert indices_des([], 1) == []
for _ in range(1000):
t = [random.randint(0, 4) for _ in range(random.randint(0, 10))]
v = random.randint(0, 4)
idx = indices_des(t, v)
assert all(t[i] == v for i in idx) # les indices rendus sont bons
assert len(idx) == t.count(v) # et il n'en manque aucun
Les cas passent. Les deux assertions sont complémentaires : la première garantit qu'on ne rend pas d'indice erroné, la seconde qu'on n'en oublie pas. Une fonction qui rendrait toujours [] passerait la première sans faillir — c'est le même raisonnement qu'à la postcondition en deux parties de min_max.
Le lien avec le chapitre 3 : indice_du_maximum rendait un indice et devait avouer son choix en cas d'ex æquo. Ici, on les rend tous : la spécification n'a plus à trancher, et l'ambiguïté disparaît. Quand une postcondition devient difficile à écrire, changer ce que la fonction renvoie est souvent la bonne réponse.
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.