Filtrer un fichier avec Python : ET, OU, NON
Énoncé
Un petit fichier décrit 12 élèves (données fictives) par deux variables qualitatives : leur classe et leur moyen de transport. L'élément de rang `i` de chaque liste décrit le même élève.
```python
classe = ["2nde", "2nde", "1re", "2nde", "1re", "1re",
"2nde", "2nde", "2nde", "1re", "1re", "2nde"]
transport = ["bus", "vélo", "bus", "pied", "vélo", "bus",
"pied", "bus", "vélo", "bus", "pied", "bus"]
def compte(classe, transport):
n = 0
for i in range(len(classe)):
if classe[i] == "2nde" and transport[i] == "bus":
n = n + 1
return n
```
a) Que renvoie `compte(classe, transport)` ? Que compte cette fonction ?
b) On remplace `and` par `or`. Que renvoie la fonction ?
c) On remplace la condition par `classe[i] == "2nde" and not transport[i] == "bus"`. Que renvoie la fonction ?
d) Dresser le tableau croisé des effectifs (classe en ligne, transport en colonne).
e) Parmi les élèves qui viennent en bus, quelle est la fréquence des élèves de Seconde ? Parmi les élèves de Seconde, quelle est la fréquence de ceux qui viennent en bus ?
Indice : Parcours les douze rangs un par un et note, pour chacun, si la condition est vraie. « ET » : les deux à la fois ; « OU » : au moins l'une des deux ; « NON » : le contraire.
Correction
- Étape 1 : La fonction parcourt les élèves un par un (rangs 0 à 11) et ajoute 1 au compteur chaque fois que la condition est vraie. Tout repose donc sur la lecture de la condition.
ET, OU, NON :
« C₁ and C₂ » est vraie quand les deux conditions sont vraies à la fois.
« C₁ or C₂ » est vraie quand au moins une des deux l'est.
« not C » est vraie quand C est fausse.
Le plus sûr est de dresser d'abord la liste des élèves de Seconde et celle des élèves qui prennent le bus, puis de les combiner.
- Étape 2 : On repère les rangs (en commençant à 0, comme Python) :
élèves de Seconde : rangs 0, 1, 3, 6, 7, 8, 11, soit 7 élèves ;
élèves qui prennent le bus : rangs 0, 2, 5, 7, 9, 11, soit 6 élèves.
a) Avec « et », il faut être dans les deux listes : rangs 0, 7 et 11. La fonction renvoie 3 : c'est le nombre d'élèves de Seconde qui viennent en bus.
b) Avec « ou », il suffit d'être dans l'une des listes : 7 + 6 - 3 = 10 élèves, car les 3 élèves communs ne se comptent qu'une fois. La fonction renvoie 10.
- Étape 3 : c) La condition sélectionne les élèves de Seconde qui ne prennent pas le bus : parmi les rangs 0, 1, 3, 6, 7, 8, 11, on retire les rangs 0, 7, 11. Il reste les rangs 1, 3, 6, 8 : la fonction renvoie 4.
d) En comptant chaque couple (classe ; transport) :
| | Bus | Vélo | À pied | Total |
|---|:-:|:-:|:-:|:-:|
| Seconde | 3 | 2 | 2 | 7 |
| Première | 3 | 1 | 1 | 5 |
| Total | 6 | 3 | 3 | 12 |
Contrôle : la case « Seconde / Bus » redonne le résultat de a), et la ligne « Seconde » moins cette case redonne celui de c), 7 - 3 = 4.
- Étape 4 : e) Parmi les élèves qui viennent en bus (colonne « Bus », 6 élèves), 3 sont en Seconde : fréquence 3/6 = 0,5.
Parmi les élèves de Seconde (ligne « Seconde », 7 élèves), 3 viennent en bus : fréquence 3/7 ≈ 0,43.
Même case, deux groupes de référence, donc deux fréquences différentes.
3/6 = 0,5 3/7 ≈ 0,43
- Étape 5 : L'erreur classique :
Répondre 7 + 6 = 13 à la question b) : les trois élèves de Seconde qui prennent le bus vérifient les deux conditions, et on les compterait deux fois. Un total de 13 pour un fichier de 12 élèves aurait dû alerter.
À retenir :
« ET » : intersection, « OU » : réunion (sans compter deux fois les éléments communs), « NON » : complémentaire. Compter chaque couple de modalités donne le tableau croisé.