Adloun

Écrire compte(table, critere) , qui compte les lignes vérifiant le…

Application directe du cours · niveau 2 · NSI (première), chapitre 6 — Traiter des données en tables · Critères, doublons, décomptes

É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.

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.