Comment retirer un élément


#1

… selon sa valeur dans un dictionnaire ?

monDico = [“nombre1” : 2, “nombre7” : 18]

Si j’ai bien trouvé que pour retirer un élément d’un dictionnaire selon sa clef on utilise
monDico.removeValue(forKey: “nombre1”)

je n’ai pas trouvé comment retirer du dictionnaire un élément dont on connait cette fois la valeur.

Dans mon exemple, comment retirer la paire dont la valeur est 18 ne connaissant pas la clef “nombre7” ?

merci


#2

Hello @Fanfan

Il y a peut-être un meilleur moyen, mais en attendant, tu peux parcourir le tableau à la recherche du nombre voulu (18 dans ton exemple), et ensuite tu stockes la clé associée (nombre7 dans ton exemple). Ensuite, tu peux utiliser removeValue(forKey:).

Mais dans ce cas là, il faudrait que tes valeurs soient uniques, sinon, si tu as deux valeurs 18, laquelle choisir ?

Bonne journée,
Joyeuses fêtes,

Alexandre


#3

Avec un Array j’utilisais un filter comme l’avait montré Draken. Mais ça ne fonctionne pas sur un Dictionary…
passe aussi de bonnes fêtes :partying_face:


#4

Ah, pourtant, je viens de tester dans un playground, et la méthode filter fonctionne également sur un dictionnaire :

var monDico: Dictionary<String, Int> = ["nombre1": 2, "nombre2": 5, "nombre3": 8, "nombre4": 7]
var valeurATrouver = 8

monDico.filter {
    if $0.value == valeurATrouver {
        monDico.removeValue(forKey: $0.key)
    }

    return $0.value == valeurATrouver
}

print(monDico) // ["nombre2": 5, "nombre4": 7, "nombre1": 2]

Bonne journée,

Alexandre


#5

En fait quand je disais “ça ne fonctionne pas sur un Dictionary”, je voulais dire : “ça fait 2 heures que j’essaie mais je n’y arrive pas…” :wink:

Merci pour ton aide, j’ai réussi à intégrer le code dans mon projet :+1:


#6

Ah d’accord :joy:
Je n’avais pas compris ça comme ça, désolé :grin:

Malgré tout, s’il est maintenant fonctionnel dans ton projet, bien joué :muscle:

Bonne soirée,

Alexandre


#7

Mais si, cela fonctionne exactement de la même manière :

    let monDico = ["nombre1":2,
                   "nombre2":18,
                   "nombre3":13,
                   "nombre4":18]
    
    let valeurMaudite = 18
    
    let dico2 = monDico.filter { $0.value != valeurMaudite }
    
    print ("Avant : ", monDico)
    print ("Après : ", dico2)

Avant : [“nombre1”: 2, “nombre2”: 18, “nombre3”: 13, “nombre4”: 18]

Après : [“nombre1”: 2, “nombre3”: 13]


EDIT :

let dico2 = monDico.filter { $0.value != valeurMaudite }

.filter fait une copie du dictionnaire monDico en ne conservant que les éléments correspondants à la condition de filtrage (avoir une valeur différente de la variable valeurMaudite).


#8

Alexandre, tu énumères le contenu d’un dictionnaire avec un .filter, tout en le modifiant lui-même. Je ne me risquerais jamais à faire ce genre de chose, de peur d’un effet de bord.


#9

Merci @Draken pour ces informations ! :grin:
Je ne savais pas que filter faisait une copie du tableau avec les nouvelles valeurs. Il est effectivement bien mieux de faire comme tu as fait ! :grin:


#10

Avec le filter comme dans un tableau, j’obtiens une erreur :

reponseAttendue, c’est un String ou un Int ?


#11

Je me réponds à moi-même :
j’ai corrigé l’erreur en ajoutant Int() à reponseAttendue soit

orange = orange.filter {$0.value != Int(reponseAttendue)}

et là ça marche.

merci @Draken