Aller au contenu

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
🐍 Console Python
>>> valeurs = [3, 8, 7]
>>> remplacer(valeurs, 3, 0)
[0, 8, 7]
>>> valeurs
[3, 8, 7]
🐍 Console Python
>>> valeurs = [3, 8, 3, 5]
>>> remplacer(valeurs, 3, 0)
[0, 8, 0, 5]
>>> valeurs
[3, 8, 3, 5]
###
# Testsbksl-nl# 1er testbksl-nlvaleurs = [3, 8, 7]bksl-nlassert remplacer(valeurs, 3, 0) == [0, 8, 7]bksl-nlassert valeurs == [3, 8, 7], "Il ne faut pas modifier les valeurs données en entrée"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], "Il ne faut pas modifier les valeurs données en entrée"bksl-nlbksl-nlbksl-nl# Tests supplémentairesbksl-nl# Valeurs identiques à l'entréebksl-nlvaleurs = [5] py-str 8bksl-nlassert remplacer(valeurs, 5, 10) == [10] py-str 8bksl-nlassert valeurs == [5] py-str 8, "Il ne faut pas modifier les valeurs données en entrée"bksl-nl# Valeurs identiques à la sortiebksl-nlvaleurs = [5] py-str 8 + [10] py-str 2bksl-nlassert remplacer(valeurs, 10, 5) == [5] py-str 10bksl-nlassert (bksl-nl valeurs == [5] py-str 8 + [10] py-str 2bksl-nl), "Il ne faut pas modifier les valeurs données en entrée"bksl-nl# Cible non présentebksl-nlvaleurs = [5] py-str 8bksl-nlassert remplacer(valeurs, 10, 1) == [5] py-str 8bksl-nlassert valeurs == [5] py-str 8, "Il ne faut pas modifier les valeurs données en entrée"bksl-nl# liste videbksl-nlvaleurs = []bksl-nlassert remplacer(valeurs, 10, 1) == []bksl-nlassert valeurs == [], "Il ne faut pas modifier les valeurs données en entrée"bksl-nlbksl-nl 5/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 :

🐍 Script Python
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

🐍 Script Python
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 :

🐍 Script Python
def remplacer(valeurs, valeur_cible, nouvelle_valeur):
    return [valeur if valeur != valeur_cible else nouvelle_valeur for valeur in valeurs]

Z