Récupérer la valeur d'une clé ou créer cette dernière si elle n'existe pas

Céline Martinet Sanchez 27/01/2021 Breves

Dans le cas de dictionnaires profonds, on peut vouloir récupérer la valeur d'une clé inexistante. Prenons l'exemple d'un dictionnaire qui servirait à répertorier des fruits en fonction de leur famille.

1
2
3
4
fruits = {
    "berries": ["strawberries", "raspberries", "blueberries", "kiwifruit"],
    "melons": ["watermelons", "rockmelons", "honeydew melons"],
}

Imaginons que nous voulons ajouter une orange. La clé “citrus” n'existant pas, il nous faut vérifier qu'ellpyte existe avant de continuer.

1
2
3
In [1]: fruits["citrus"] = ["orange"]
- --------------------------------------------------------------------------
KeyError: 'citrus'

Le premier réflexe est alors d'écrire une fonction qui ressemblerait à ceci :

1
2
3
4
5
6
def add_key_if_not_exists(key):
    if not fruits.get(key):
            fruits[key] = []

add_key_if_not_exists("citrus")
fruits["citrus"].append("orange")

Un peu pénible, non ?

Le type dict de Python intègre par défaut la méthode setdefault (lire la doc) qui fait exactement ce que nous voulons en une seule ligne !

1
2
3
4
5
6
fruits.setdefault("citrus", []).append("lime")

# {'berries': ['strawberries', 'raspberries', 'blueberries', 'kiwifruit'],
# 'melons': ['watermelons', 'rockmelons', 'honeydew melons'],
# 'citrus': ['orange', 'lime']}

Bien sûr, notre cas est très simple. Mais si vous jetez un coup d’œil à ce commit, vous comprendrez pourquoi cette petite méthode est bien utile.

⚠️ J'ai fait l'erreur suivante avant de me rendre compte que ça ne pouvait pas fonctionner ! A votre avis, pourquoi ?

1
2
3
4
5
6
7
8
9
10
fruits = []

# Add "lime" to {"citrus": []} and create key if it does not exist.
fruits.setdefault("citrus", ["lime"])
# => OK, "lime" is in the list.

# Add "bergamot" to {"citrus": []} and create key if it does not exist.
fruits.setdefault("citrus", ["bergamot"])
# WRONG! fruits["citrus"] only contains "lime"!

Céline Martinet Sanchez

Freelance depuis 2014, je suis développeuse web et formatrice. Au travers de ce site, je parle de Python, de startups et de code en général.

Découvrir mes projets