Aller au contenu

TP Python – Tableaux, chaînes et journaux

BTS SIO SISR 1re année – Mathématiques pour l'informatique – S12

Note

Comment ce TP fonctionne. Chaque exercice a un éditeur Python intégré à la page (il s'exécute dans ton navigateur, rien à installer). Avant de lancer, écris sur ta feuille ce que tu anticipes (« J'anticipe »). Puis lance et compare. Le bouton Valider exécute des tests : un test réussi ne dispense pas de comprendre pourquoi.

Exercice A – Moyenne et maximum

Écris moyenne(t), maximum(t) et indice_du_max(t) (premier indice du maximum) pour une liste non vide de nombres. N'utilise ni sum, ni max, ni index.

J'anticipe. Pour [14, 3, 27, 9, 27, 5], quels résultats attends-tu pour les trois fonctions ?

###
t = [14, 3, 27, 9, 27, 5]bksl-nlassert moyenne([12, 8, 15]) == 35 / 3bksl-nlassert moyenne([4]) == 4bksl-nlassert abs(moyenne(t) - 85 / 6) < 1e-9bksl-nlassert maximum(t) == 27 and maximum([-5, -2, -9]) == -2bksl-nlassert indicepy-unddupy-undmax(t) == 2bksl-nlassert indicepy-unddupy-undmax([1, 2, 3]) == 2 and indicepy-unddupy-undmax([9]) == 0bksl-nlbksl-nl ∞/∞

def moyenne(t):bksl-nl s = 0bksl-nl for x in t:bksl-nl # À compléter : accumuler dans sbksl-nl passbksl-nl return 0 # À compléter : s divisé par le nombre d'élémentsbksl-nlbksl-nldef maximum(t):bksl-nl m = t[0]bksl-nl for i in range(1, len(t)):bksl-nl # À compléter : mettre à jour m si t[i] est plus grandbksl-nl passbksl-nl return mbksl-nlbksl-nldef indicepy-unddupy-undmax(t):bksl-nl imax = 0bksl-nl for i in range(1, len(t)):bksl-nl # À compléter : mettre à jour imax si t[i] > t[imax]bksl-nl passbksl-nl return imaxbksl-nlbksl-nl



Exercice B – Rechercher

Écris position(t, x) (premier indice de x, ou -1), compte(t, x) (nombre d'occurrences) et dichotomie(t, x) (indice de x dans la liste triée t, ou -1).

Je comprends. Que se passe-t-il si tu appelles dichotomie sur une liste non triée ?

###
t = [14, 3, 27, 9, 27, 5]bksl-nlassert position(t, 27) == 2 and position(t, 5) == 5 and position(t, 99) == -1bksl-nlassert compte(t, 27) == 2 and compte(t, 3) == 1 and compte(t, 0) == 0bksl-nls = [2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44]bksl-nlassert dichotomie(s, 38) == 12 and dichotomie(s, 2) == 0 and dichotomie(s, 44) == 14bksl-nlassert dichotomie(s, 15) == -1 and dichotomie(s, 1) == -1 and dichotomie(s, 99) == -1bksl-nlassert dichotomie([], 3) == -1 and dichotomie([7], 7) == 0bksl-nlassert all(dichotomie(s, x) == i for i, x in enumerate(s))bksl-nlbksl-nl ∞/∞

def position(t, x):bksl-nl for i in range(len(t)):bksl-nl # À compléter : renvoyer i si t[i] vaut xbksl-nl passbksl-nl return -1bksl-nlbksl-nldef compte(t, x):bksl-nl n = 0bksl-nl for y in t:bksl-nl # À compléter : compter les occurrences de xbksl-nl passbksl-nl return nbksl-nlbksl-nldef dichotomie(t, x):bksl-nl debut = 0bksl-nl fin = len(t) - 1bksl-nl while debut <= fin:bksl-nl milieu = (debut + fin) // 2bksl-nl # À compléter : comparer t[milieu] à x, renvoyer milieu si égal,bksl-nl # sinon réduire la zone à droite (debut) ou à gauche (fin).bksl-nl # Sans cette mise à jour la boucle ne s'arrête pas : on sort donc ici.bksl-nl breakbksl-nl return -1bksl-nlbksl-nl



Exercice C – Trier

Écris tri_selection(t) qui renvoie une nouvelle liste triée, sans modifier t et sans sorted ni sort.

Je comprends. Pourquoi commence-t-on par r = list(t) ?

###
t = [7, 3, 5, 1]bksl-nlassert tripy-undselection(t) == [1, 3, 5, 7]bksl-nlassert t == [7, 3, 5, 1]bksl-nlassert tripy-undselection([5, 2, 9, 1]) == [1, 2, 5, 9]bksl-nlassert tripy-undselection([]) == [] and tripy-undselection([4]) == [4]bksl-nlassert tripy-undselection([3, 1, 3, 2, 1]) == [1, 1, 2, 3, 3]bksl-nlassert tripy-undselection([9, 8, 7, 6, 5, 4, 3, 2, 1]) == [1, 2, 3, 4, 5, 6, 7, 8, 9]bksl-nlbksl-nl ∞/∞

def tripy-undselection(t):bksl-nl r = list(t)bksl-nl n = len(r)bksl-nl for i in range(n - 1):bksl-nl m = ibksl-nl for j in range(i + 1, n):bksl-nl # À compléter : mémoriser dans m l'indice du plus petit élémentbksl-nl passbksl-nl # À compléter : échanger r[i] et r[m]bksl-nl return rbksl-nlbksl-nl



Exercice D – Tableaux à deux dimensions

Écris somme_lignes(g), somme_colonnes(g) et transposee(g) pour une grille rectangulaire (liste de listes).

###
g = [[12, 8, 15, 10], [9, 14, 11, 7], [16, 13, 6, 18]]bksl-nlassert sommepy-undlignes(g) == [45, 41, 53]bksl-nlassert sommepy-undcolonnes(g) == [37, 35, 32, 35]bksl-nlassert transposee(g) == [[12, 9, 16], [8, 14, 13], [15, 11, 6], [10, 7, 18]]bksl-nlassert transposee([[1, 2], [3, 4]]) == [[1, 3], [2, 4]]bksl-nlassert sum(sommepy-undlignes(g)) == sum(sommepy-undcolonnes(g)) == 139bksl-nlbksl-nl ∞/∞

def sommepy-undlignes(g):bksl-nl resultat = []bksl-nl for ligne in g:bksl-nl s = 0bksl-nl for x in ligne:bksl-nl # À compléter : accumuler dans sbksl-nl passbksl-nl resultat.append(s)bksl-nl return resultatbksl-nlbksl-nldef sommepy-undcolonnes(g):bksl-nl resultat = []bksl-nl for j in range(len(g[0])):bksl-nl s = 0bksl-nl for i in range(len(g)):bksl-nl # À compléter : ajouter g[i][j]bksl-nl passbksl-nl resultat.append(s)bksl-nl return resultatbksl-nlbksl-nldef transposee(g):bksl-nl resultat = []bksl-nl for j in range(len(g[0])):bksl-nl ligne = []bksl-nl for i in range(len(g)):bksl-nl # À compléter : ajouter g[i][j] à lignebksl-nl passbksl-nl resultat.append(ligne)bksl-nl return resultatbksl-nlbksl-nl



Exercice E – Chaînes

Écris inverse(s), est_palindrome(s) (sans tenir compte des majuscules) et acronyme(phrase) (les initiales en majuscules : "systèmes et réseaux" donne "SER").

###
assert inverse("serveur") == "ruevres" and inverse("") == ""bksl-nlassert estpy-undpalindrome("radar") is True and estpy-undpalindrome("Kayak") is Truebksl-nlassert estpy-undpalindrome("serveur") is Falsebksl-nlassert acronyme("systèmes et réseaux") == "SER"bksl-nlassert acronyme("bts services informatiques aux organisations") == "BSIAO"bksl-nlassert acronyme("") == ""bksl-nlbksl-nl ∞/∞

def inverse(s):bksl-nl r = ""bksl-nl for c in s:bksl-nl # À compléter : ajouter c au DÉBUT de rbksl-nl passbksl-nl return rbksl-nlbksl-nldef estpy-undpalindrome(s):bksl-nl s = s.lower()bksl-nl return False # À compléter : comparer s à son inversebksl-nlbksl-nldef acronyme(phrase):bksl-nl r = ""bksl-nl for mot in phrase.split():bksl-nl # À compléter : ajouter l'initiale du mot, en majusculebksl-nl passbksl-nl return rbksl-nlbksl-nl



Exercice F – Exploiter un journal

Chaque ligne d'un journal a la forme date heure adresse événement compte. Écris echecs_par_adresse(lignes) (dictionnaire adresse → nombre de lignes dont l'événement est LOGIN_FAILED) et adresses_suspectes(lignes, seuil) (liste triée des adresses ayant au moins seuil échecs).

###
log = ["2026-03-14 08:12:45 192.168.1.23 LOGINpy-undOK alice", "2026-03-14 08:13:02 192.168.1.77 LOGINpy-undFAILED admin", "2026-03-14 08:13:09 192.168.1.77 LOGINpy-undFAILED admin", "2026-03-14 08:13:15 192.168.1.77 LOGINpy-undFAILED root", "2026-03-14 08:14:20 192.168.1.23 LOGINpy-undFAILED alice", "2026-03-14 08:15:01 192.168.1.40 LOGINpy-undOK bob"]bksl-nlassert echecspy-undparpy-undadresse(log) == {"192.168.1.77": 3, "192.168.1.23": 1}bksl-nlassert echecspy-undparpy-undadresse([]) == {}bksl-nlassert adressespy-undsuspectes(log, 2) == ["192.168.1.77"]bksl-nlassert adressespy-undsuspectes(log, 1) == ["192.168.1.23", "192.168.1.77"]bksl-nlassert adressespy-undsuspectes(log, 4) == []bksl-nlbksl-nl ∞/∞

def echecspy-undparpy-undadresse(lignes):bksl-nl d = {}bksl-nl for ligne in lignes:bksl-nl c = ligne.split()bksl-nl # À compléter : si c[3] vaut "LOGINpy-undFAILED", incrémenter d[c[2]]bksl-nl # (la créer à 1 si l'adresse n'est pas encore dans d)bksl-nl return dbksl-nlbksl-nldef adressespy-undsuspectes(lignes, seuil):bksl-nl d = echecspy-undparpy-undadresse(lignes)bksl-nl liste = []bksl-nl for adresse in d:bksl-nl # À compléter : garder l'adresse si son nombre d'échecs est >= seuilbksl-nl passbksl-nl return sorted(liste)bksl-nlbksl-nl