Adloun

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

Faire l'exercice suivant avec le tuteur

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.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant avec le tuteur →