Aller au contenu

Devoir NSI : Dictionnaires 20-21 G2

L'usage de la calculatrice n'est pas autorisé.

Durée : 55 min

Recettes de cuisine

Dans cet exercice, on s'intéresse à la définition de fonctions permettant de manipuler un livre de recettes de cuisine. Comme tout bon livre de recettes qui se respecte, chaque recette décrit notamment l'ensemble des ingrédients qui la composent.

Ă€ titre d'exemple, un livre de recettes de desserts pourrait contenir les informations suivantes:

Recette Ingrédients
Gâteau au chocolat chocolat, oeuf, farine, sucre, beurre
Gâteau au yaourt yaourt, oeuf, farine, sucre
CrĂŞpes oeuf, farine, lait
Quatre-quarts oeuf,farine, beurre, sucre
Kouign amann farine, beurre, sucre

Un livre de recettes est donc représenté en Python par un dictionnaire de type dict[str : list]

  • les noms des recettes, de type str, comme clĂ©s

  • l'ensemble des ingrĂ©dients, de type list, comme valeurs associĂ©es.

Ainsi, l'exemple précédent donnerait le dictionnaire Dessert suivant :

Dessert = { 'gateau chocolat' : ['chocolat', 'oeuf', 'farine', 'sucre',
'beurre'], 'gateau yaourt' : ['yaourt', 'oeuf', 'farine', 'sucre'],
'crepes' : ['oeuf', 'farine', 'lait'], 'quatre-quarts' : ['oeuf',
'farine', 'beurre', 'sucre'], 'kouign amann' : ['farine', 'beurre',
'sucre'] }

Question 1

Donner une définition de la fonction nb_ingredients qui, étant donnés un livre de recettes D et le nom d'une recette r contenue dans D, renvoie le nombre d'ingrédients nécessaires à la recette r.

Par exemple:

>>> nb_ingredients(Dessert, 'crepes')
>>> 3
>>> nb_ingredients(Dessert, 'gateau chocolat')
>>> 5
def nb_ingredients(D,r):
    return len(D[r])

Question 2

Donner une définition de la fonction recette_avec qui, étant donnés un livre de recettes D et le nom d'un ingrédient i, renvoie la liste des recettes qui utilisent cet ingrédient.

Par exemple :

>>> recette_avec(Dessert, 'beurre')
>>> ['gateau chocolat', 'kouign amann', 'quatre-quarts']
>>> recette_avec(Dessert, 'lait')
>>> ['crepes']
>>> recette_avec(Dessert, 'fraise')
>>> []
def recette_avec(D,i):
    res=[]
    for k,j in D.items():
        if i in j:
            res.append(k)
    return res

Question 3

Donner une définition de la fonction tous_ingredients qui, étant donné un livre de recettes D, renvoie l'ensemble de tous les ingrédients apparaissant au moins une fois dans une recette de D, sans doublons.

Par exemple :

>>> tous_ingredients(Dessert)
>>> ['beurre', 'chocolat', 'farine', 'lait', 'oeuf', 'sucre', 'yaourt']
def tous_ingredients(D):
    res=[]
    for i in D.values():
        for j in i:
            if j not in res:
                res.append(j)
    return res

Question 4

Tout livre de recettes contient une table des ingrédients permettant d'associer à chaque ingrédient l'ensemble des recettes qui l'utilisent.

Une telle table est représentée en Python par le type dict[str : liste] dans lequel une clé est un ingrédient dont la valeur associée est l'ensemble des recettes qui l'utilisent.

Donner une définition de la fonction table_ingredients qui, étant donné un livre de recettes D, renvoie la table des ingrédients associée.

Par exemple :

>>> table_ingredients(Dessert)
>>> {'chocolat': ['gateau chocolat'], 'oeuf' : ['crepes', 'gateau
chocolat', 'gateau yaourt', 'quatre-quarts'], 'lait' : ['crepes'],
'yaourt' : ['gateau yaourt'], 'farine' : ['crepes' , 'gateau
chocolat' , 'gateau yaourt' , 'kouign amann' , 'quatre-quarts' ],
'beurre' : ['gateau chocolat', 'kouign amann', 'quatre-quarts'],
'sucre' : ['gateau chocolat', 'gateau yaourt' , 'kouign amann' ,
'quatre-quarts' ]}
def table_ingredients(D):
    return {i:recette_avec(D,i) for i in tous_ingredients(D)}

Question 5

Donner une définition de la fonction ingredient_principal qui, étant donné un livre de recettes D, renvoie le nom de l'ingrédient utilisé par le plus grand nombre de recettes. On supposera ici que D contient au moins une recette.

Par exemple :

>>> ingredient_principal(Dessert)
>>> 'farine'
def ingredient_principal(D):
    dicting={i:len(recette_avec(D,i)) for i in tous_ingredients(D)}
    listnb=list(dicting.values())
    listnb.sort()
    max=listnb[-1]
    for i,j in dicting.items():
        if j==max:
            return i

Question 6

Certaines personnes sont allergiques à certains ingrédients. On aimerait donc pouvoir ne conserver d'un livre de recettes que celles qui n'utilisent pas un ingrédient donné. Donner une définition de la fonction recettes_sans qui, étant donnés un livre de recettes D et un ingrédient i, renvoie un nouveau livre de recettes ne contenant que des recettes de D n'utilisant pas l'ingrédient i.

Par exemple :

>>> recettes_sans(Dessert, 'farine')
>>> []

>>> recettes_sans(Dessert, 'oeuf')
>>> {'kouign amann': ['beurre', 'farine', 'sucre']}

>>> recettes_sans(Dessert, 'beurre')
>>> {'gateau yaourt': ['farine', 'oeuf', 'sucre', 'yaourt'], 'crepes' :['farine', 'lait', 'oeuf']}
def recettes_sans(D,i):
    return {j:k for j,k in D.items() if i not in k}

def recettes_sans2(D,i):
    res={}
    for j,k in D.items():
        if i not in k:
            res[j]=k