NSI (première) · Chapitre 6 · Application directe du cours
Écrire compte(table, critere) , qui compte les lignes vérifiant le…
Traiter des données en tables · Critères, doublons, décomptes · niveau 2
Énoncé
Écrire compte(table, critere), qui compte les lignes vérifiant le critère sans construire la sous-table. En quoi est-ce préférable, et comment le valider ?
Corrigé
def compte(table, critere):
"""Nombre de lignes vérifiant le critère.
Postcondition : 0 <= résultat <= len(table), et le résultat vaut
len(selection(table, critere)).
"""
n = 0
for ligne in table:
if critere(ligne):
n = n + 1
return n
compte(eleves, en_1g3) # 2
len(selection(eleves, en_1g3)) # 2
Pourquoi ne pas construire la sous-table. Le décompte ne garde qu'un entier en mémoire, tandis que selection construit un tableau qui peut faire la taille de la table entière. Sur cinq lignes c'est indifférent ; sur un million, la différence est celle entre un entier et un million de références. Les deux font le même nombre de tours : le gain est en mémoire, pas en temps.
La validation par propriété. On ne teste pas des valeurs attendues, on teste l'égalité des deux voies sur tables tirées au hasard :
import random
random.seed(7)
for _ in range(1000):
t = [{"x": random.randint(0, 9)} for _ in range(random.randint(0, 20))]
s = random.randint(0, 9)
crit = lambda l: l["x"] >= s
assert compte(t, crit) == len(selection(t, crit))
cas passent, y compris des tables vides — que le tirage produit de temps en temps, et c'est précisément l'intérêt de tirer aussi la taille.
100 % gratuit
Essaie le suivant avec le tuteur
- L'exercice suivant avec le tuteur, sans compte : il guide pas à pas, sans donner la réponse
- 16 autres exercices corrigés dans ce chapitre, et 20 à chercher avec le tuteur
- Le podcast et la vidéo du chapitre et la correction filmée du TD : 2 minutes sans compte
Sans compte : le cours, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.