Aller au contenu

Le bon enclos⚓︎

On considère une table (une liste de dictionnaires Python) qui contient des enregistrements relatifs à des animaux hébergés dans un refuge.

Les attributs des enregistrements sont :

  • nom,
  • espece,
  • age,
  • enclos.

Les valeurs associées à nom et espece sont des chaines de caractères, celles associées à age et enclos des entiers.

Voici un exemple d'une telle table :

🐍 Script Python
animaux = [
  {'nom': 'Medor', 'espece': 'chien', 'age': 5, 'enclos': 2},
  {'nom': 'Titine', 'espece': 'chat', 'age': 2, 'enclos': 5},
  {'nom': 'Tom', 'espece': 'chat', 'age': 7, 'enclos': 4},
  {'nom': 'Belle', 'espece': 'chien', 'age': 6, 'enclos': 3},
  {'nom': 'Mirza', 'espece': 'chat', 'age': 6, 'enclos': 5}
]

On garantit que chaque enregistrement (un dictionnaire Python) contient l'ensemble des informations (aucune clé ne manque dans un dictionnaire).

Programmer une fonction selection_enclos qui :

  • prend en paramètres :
    • une liste table_animaux contenant des enregistrements relatifs à des animaux (comme dans l'exemple ci-dessus),
    • un numéro d'enclos num_enclos ;
  • renvoie une liste contenant les enregistrements de table_animaux dont l'attribut enclos est égal à num_enclos. Dans cette liste, les enregistrements seront donnés dans le même ordre que dans la liste d'entrée.

Exemples avec la liste animaux ci-dessus :

Exemples
🐍 Console Python
>>> selection_enclos(animaux, 5)
[{'nom': 'Titine', 'espece': 'chat', 'age': 2, 'enclos': 5},
{'nom':'Mirza', 'espece':'chat', 'age':6, 'enclos':5}]
>>> selection_enclos(animaux, 2)
[{'nom':'Medor', 'espece':'chien', 'age':5, 'enclos':2}]
>>> selection_enclos(animaux, 7)
[]
###
# Testsbksl-nlanimaux = [bksl-nl {"nom": "Medor", "espece": "chien", "age": 5, "enclos": 2},bksl-nl {"nom": "Titine", "espece": "chat", "age": 2, "enclos": 5},bksl-nl {"nom": "Tom", "espece": "chat", "age": 7, "enclos": 4},bksl-nl {"nom": "Belle", "espece": "chien", "age": 6, "enclos": 3},bksl-nl {"nom": "Mirza", "espece": "chat", "age": 6, "enclos": 5},bksl-nl]bksl-nlbksl-nlassert selectionpy-undenclos(animaux, 5) == [bksl-nl {"nom": "Titine", "espece": "chat", "age": 2, "enclos": 5},bksl-nl {"nom": "Mirza", "espece": "chat", "age": 6, "enclos": 5},bksl-nl]bksl-nlassert selectionpy-undenclos(animaux, 2) == [bksl-nl {"nom": "Medor", "espece": "chien", "age": 5, "enclos": 2}bksl-nl]bksl-nlassert selectionpy-undenclos(animaux, 7) == []bksl-nlbksl-nl# Tests supplémentairesbksl-nlenclos = {animal["enclos"] for animal in animaux}bksl-nlfor numpy-undenclos in enclos:bksl-nl reponse = [ani for ani in animaux if ani["enclos"] == numpy-undenclos]bksl-nl assert selectionpy-undenclos(animaux, numpy-undenclos) == reponsebksl-nlbksl-nlassert selectionpy-undenclos(animaux, -1) == []bksl-nlbksl-nlanimaux = [bksl-nl {"nom": "Moder", "espece": "lapin", "age": 5, "enclos": 0},bksl-nl {"nom": "Ollie", "espece": "furet", "age": 6, "enclos": 0},bksl-nl]bksl-nlassert selectionpy-undenclos(animaux, 0) == animauxbksl-nlassert selectionpy-undenclos(animaux, 1) == []bksl-nlbksl-nl 5/5

def selectionpy-undenclos(tablepy-undanimaux, numpy-undenclos):bksl-nl ...bksl-nlbksl-nlbksl-nl# Testsbksl-nlanimaux = [bksl-nl {"nom": "Medor", "espece": "chien", "age": 5, "enclos": 2},bksl-nl {"nom": "Titine", "espece": "chat", "age": 2, "enclos": 5},bksl-nl {"nom": "Tom", "espece": "chat", "age": 7, "enclos": 4},bksl-nl {"nom": "Belle", "espece": "chien", "age": 6, "enclos": 3},bksl-nl {"nom": "Mirza", "espece": "chat", "age": 6, "enclos": 5},bksl-nl]bksl-nlassert selectionpy-undenclos(animaux, 5) == [bksl-nl {"nom": "Titine", "espece": "chat", "age": 2, "enclos": 5},bksl-nl {"nom": "Mirza", "espece": "chat", "age": 6, "enclos": 5},bksl-nl]bksl-nlassert selectionpy-undenclos(animaux, 2) == [bksl-nl {"nom": "Medor", "espece": "chien", "age": 5, "enclos": 2}bksl-nl]bksl-nlassert selectionpy-undenclos(animaux, 7) == []bksl-nlbksl-nldef selectionpy-undenclos(tablepy-undanimaux, numpy-undenclos):bksl-nl resultat = []bksl-nl for animal in tablepy-undanimaux:bksl-nl if animal["enclos"] == numpy-undenclos:bksl-nl resultat.append(animal)bksl-nl return resultatbksl-nlbksl-nl

A

Le problème revient à filtrer les éléments d'une liste de dictionnaires selon un critère portant sur les valeurs des dictionnaires.

On crée une liste resultat qui contiendra les enregistrements souhaités.

On parcourt ensuite la liste des enregistrements avec la variable nommée animal. Pour chaque animal on teste son enclos. S'il correspond à celui cherché, on ajoute l'enregistrement à la fin de la liste.

Il faut réaliser un filtre sur une liste, on peut donc facilement écrire la liste renvoyée en compréhesion :

🐍 Script Python
def selection_enclos(table_animaux, num_enclos):
    return [animal for animal in table_animaux if animal["enclos"] == num_enclos]

Z