Écrire compte(t, v) qui renvoie le nombre d'occurrences de v dans t…
Application directe du cours · niveau 1 (application) · NSI (première), chapitre 4 — Les types construits · P-uplets, déballage et compréhensions
Énoncé
Écrire compte(t, v) qui renvoie le nombre d'occurrences de v dans t, sans utiliser t.count.
Corrigé
def compte(t, v):
"""Nombre d'occurrences de v dans t.
Postcondition : 0 <= resultat <= len(t).
"""
n = 0
for x in t:
if x == v:
n = n + 1
return n
Parcours par élément : la position ne sert à rien, seule la valeur compte. L'accumulateur part de , valeur juste sur le tableau vide.
Vérification.
assert compte([1, 2, 1, 1], 1) == 3
assert compte([], 1) == 0
assert compte([1, 2], 3) == 0
for _ in range(1000):
t = [random.randint(0, 3) for _ in range(random.randint(0, 10))]
v = random.randint(0, 3)
assert compte(t, v) == t.count(v)
Les cas concordent avec t.count.
La variante par compréhension est également correcte :
def compte(t, v):
return len([x for x in t if x == v])
Elle construit cependant un tableau intermédiaire dont on ne garde que la longueur — on paie de la mémoire pour un simple comptage. Sur un million d'éléments, la différence est très concrète.
Un contrôle qui vaut la peine : la somme des effectifs de toutes les valeurs distinctes doit valoir len(t). C'est la postcondition de la fonction occurrences du chapitre 5, qui n'est rien d'autre que cette fonction faite en une passe pour toutes les valeurs à la fois.
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.