exo REM
Attention
La difficulté de cet exercice est qu'il faut prendre soin de ne pas modifier la liste initiale.
Testez
Une idée qui vient à l'esprit est la suivante :
def remplacer_naif(valeurs, valeur_cible, nouvelle_valeur):
valeurs_2 = valeurs
for i in range(len(valeurs_2)):
if valeurs_2[i] == valeur_cible:
valeurs_2[i] = nouvelle_valeur
return valeurs_2
valeurs = [3, 8, 7]
assert remplacer_naif(valeurs, 3, 0) == [0, 8, 7]
assert valeurs == [3, 8, 7]
Recopiez ce script ci-dessus puis testez-le.
đ” đ” đ”
đ Cela ne rĂ©pond pas au problĂšme, en effet tout se passe comme si lâinstruction valeurs_2 = valeurs
donnait deux noms différents au
mĂȘme objet. En rĂ©alitĂ©, valeurs_2
nâest pas une nouvelle liste.
La solution proposée en correction
On crĂ©e donc une autre liste qui doit ĂȘtre un autre objet, qui sera celle renvoyĂ©e par la fonction.
La solution proposée crée une liste vide que l'on complÚte au fur et à mesure en parcourant les valeurs de valeurs
.
Autre solution possible
def remplacer(valeurs, valeur_cible, nouvelle_valeur):
n = len(valeurs)
valeurs_2 = [0] * n
for i in range(n):
if valeurs[i] == valeur_cible:
valeurs_2[i] = nouvelle_valeur
else:
valeurs_2[i] = valeurs[i]
return valeurs_2
une solution avec liste en compréhension
On aurait aussi pu utiliser une liste par compréhension et un opérateur ternaire :
def remplacer(valeurs, valeur_cible, nouvelle_valeur):
return [valeur if valeur != valeur_cible else nouvelle_valeur for valeur in valeurs]