Remplacer une valeur⚓︎
Écrire la fonction remplacer
prenant en argument :
- une liste d'entiers
valeurs
- un entier
valeur_cible
- un entier
nouvelle_valeur
et renvoyant une nouvelle liste contenant les mêmes valeurs que valeurs
, dans le même ordre, sauf valeur_cible
qui a été remplacée par nouvelle_valeur
.
La liste passée en paramètre ne doit pas être modifiée.
Exemples
>>> valeurs = [3, 8, 7]
>>> remplacer(valeurs, 3, 0)
[0, 8, 7]
>>> valeurs
[3, 8, 7]
>>> valeurs = [3, 8, 3, 5]
>>> remplacer(valeurs, 3, 0)
[0, 8, 0, 5]
>>> valeurs
[3, 8, 3, 5]
def remplacer(valeurs, valeurpy-undcible, nouvellepy-undvaleur):bksl-nl ...bksl-nlbksl-nlbksl-nl# Testsbksl-nl# 1er testbksl-nlvaleurs = [3, 8, 7]bksl-nlassert remplacer(valeurs, 3, 0) == [0, 8, 7]bksl-nlassert valeurs == [3, 8, 7]bksl-nl# 2nd testbksl-nlvaleurs = [3, 8, 3, 5]bksl-nlassert remplacer(valeurs, 3, 0) == [0, 8, 0, 5]bksl-nlassert valeurs == [3, 8, 3, 5]bksl-nlbksl-nldef remplacer(valeurs, valeurpy-undcible, nouvellepy-undvaleur):bksl-nl resultat = []bksl-nl for element in valeurs:bksl-nl if element == valeurpy-undcible:bksl-nl resultat.append(nouvellepy-undvaleur)bksl-nl else:bksl-nl resultat.append(element)bksl-nl return resultatbksl-nlbksl-nl
A
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]
Z