Diagramme en barres⚓︎
On souhaite construire un diagramme en barres à partir de deux listes :
-
une liste
categories
contenant des chaînes de caractères, -
une liste
valeurs
contenant des nombres entiers positifs ou nuls.
On garantit que les deux listes ont la même longueur.
Si l'on prend par exemple :
categories = ["Anne", "Luc", "Patrick", "Sam"]
- et
valeurs = [10, 8, 5, 15]
,
on souhaite obtenir :
>>> print(barres(categories, valeurs))
Anne : ##########
Luc : ########
Patrick : #####
Sam : ###############
Comme on peut le voir, afin de construire un diagramme convenable, on doit faire en sorte que toutes les "barres" débutent au même niveau. Il faut donc compléter certaines catégories avec des caractères d'espacement. On utilise pour ce faire la fonction ajoute_espaces
qui prolonge une chaîne de caractères avec des espaces jusqu'à ce que sa longueur soit égale à celle passée en paramètre. Par exemple :
>>> ajoute_espaces("Anne", 7)
"Anne "
>>> ajoute_espaces("Luc", 7)
"Luc "
On garantit que, dans les paramètres de la fonction ajoute_espaces
, la chaîne mot
est toujours de longueur inférieure ou égale à la longueur
souhaitée. Ainsi, on ne traitera pas le cas où l'on souhaite par exemple allonger jusqu'à la longueur 2 une chaîne de 3 caractères.
Remarque
Dans les règles de typographie française, on ajoute une espace entre la fin d'un mot et les deux points : on écrit ainsi Patrick :
et non Patrick:
.
Compléter les deux fonctions ajoute_espace
et barres
ci-dessous :
def ajoute_espaces(mot, longueur):
return ... + " " * (...)
def barres(categories, valeurs):
longueur_max = ...
for mot in ...:
if len(mot) > ...:
longueur_max = ...
diagramme = ""
for i in range(len(categories)):
diagramme += ... # la catégorie
diagramme += " : "
diagramme += ... # la barre
diagramme += "\n" # retour à la ligne
return ...
Exemples
>>> ajoute_espaces("Anne", 7)
"Anne "
>>> ajoute_espaces("Luc", 7)
"Luc "
>>> ajoute_espaces("nsi", 3)
"nsi"
>>> ajoute_espaces("", 2)
" "
>>> categories = ["Anne", "Luc", "Patrick", "Sam"]
>>> valeurs = [10, 8, 5, 15]
>>> print(barres(categories, valeurs))
Anne : ##########
Luc : ########
Patrick : #####
Sam : ###############
>>> categories = ["A", "B", "", "EEEEE"]
>>> valeurs = [1, 1, 0, 5]
>>> print(barres(categories, valeurs))
A : #
B : #
:
EEEEE : #####
def ajoutepy-undespaces(mot, longueur):bksl-nl return ... + " " py-str (...)bksl-nlbksl-nlbksl-nldef barres(categories, valeurs):bksl-nl longueurpy-undmax = ...bksl-nl for mot in ...:bksl-nl if len(mot) > ...:bksl-nl longueurpy-undmax = ...bksl-nlbksl-nl diagramme = ""bksl-nl for i in range(len(categories)):bksl-nl diagramme += ... # la catégoriebksl-nl diagramme += " : "bksl-nl diagramme += ... # la barrebksl-nl diagramme += "\n" # retour à la lignebksl-nlbksl-nl return ...bksl-nlbksl-nlbksl-nl# Testsbksl-nl# Fonction ajoutepy-undespacesbksl-nlassert ajoutepy-undespaces("Anne", 7) == "Anne "bksl-nlassert ajoutepy-undespaces("Luc", 7) == "Luc "bksl-nlassert ajoutepy-undespaces("nsi", 3) == "nsi"bksl-nlassert ajoutepy-undespaces("", 2) == " "bksl-nl# Fonction barresbksl-nlcategories = ["Anne", "Luc", "Patrick", "Sam"]bksl-nlvaleurs = [10, 8, 5, 15]bksl-nldiagramme = """Anne : ##########bksl-nlLuc : ########bksl-nlPatrick : #####bksl-nlSam : ###############bksl-nl"""bksl-nlassert barres(categories, valeurs) == diagrammebksl-nlcategories = ["A", "B", "", "EEEEE"]bksl-nlvaleurs = [1, 1, 0, 5]bksl-nldiagramme = """A : #bksl-nlB : #bksl-nl : bksl-nlEEEEE : #####bksl-nl"""bksl-nlassert barres(categories, valeurs) == diagrammebksl-nlbksl-nldef ajoutepy-undespaces(mot, longueur):bksl-nl return mot + " " py-str (longueur - len(mot))bksl-nlbksl-nlbksl-nldef barres(categories, valeurs):bksl-nl longueurpy-undmax = 0bksl-nl for mot in categories:bksl-nl if len(mot) > longueurpy-undmax:bksl-nl longueurpy-undmax = len(mot)bksl-nlbksl-nl diagramme = ""bksl-nl for i in range(len(categories)):bksl-nl diagramme += ajoutepy-undespaces(categories[i], longueurpy-undmax)bksl-nl diagramme += " : "bksl-nl diagramme += "#" py-str valeurs[i]bksl-nl diagramme += "\n"bksl-nlbksl-nl return diagrammebksl-nlbksl-nlbksl-nl# Testsbksl-nlassert ajoutepy-undespaces("Anne", 7) == "Anne "bksl-nlassert ajoutepy-undespaces("Luc", 7) == "Luc "bksl-nlassert ajoutepy-undespaces("nsi", 3) == "nsi"bksl-nlassert ajoutepy-undespaces("", 2) == " "bksl-nlcategories = ["Anne", "Luc", "Patrick", "Sam"]bksl-nlvaleurs = [10, 8, 5, 15]bksl-nldiagramme = """Anne : ##########bksl-nlLuc : ########bksl-nlPatrick : #####bksl-nlSam : ###############bksl-nl"""bksl-nlassert barres(categories, valeurs) == diagrammebksl-nlcategories = ["A", "B", "", "EEEEE"]bksl-nlvaleurs = [1, 1, 0, 5]bksl-nldiagramme = """A : #bksl-nlB : #bksl-nl : bksl-nlEEEEE : #####bksl-nl"""bksl-nlassert barres(categories, valeurs) == diagrammebksl-nlbksl-nl
A
Commentaires⚓︎
Le code est construit autour de deux fonctions, ajoute_espaces
et barre
.
{{ IDE('exo_corr') }}
Dans la fonction ajoute_espaces
, on ajoute des caractères à la chaîne passée en paramètre. Celle-ci étant de longueur inférieure ou égale à la longueur
souhaitée, on peut faire return mot + " " * (longueur-len(mot))
, la différence valant au minimum 0
(ce qui n'ajoute aucun espace).
La fonction barres
nécessite deux étapes :
- dans un premier temps, on recherche la longueur maximale des chaînes dans la liste
categories
, - une fois cette longueur trouvée, on crée le
diagramme
(une chaîne vide) et pour chaque indicei
entre0
etlen(categories)
(exclus) :- on ajoute la catégorie avec suffisamment d'espaces,
- on ajoute les
:
, - on dessine la barre,
- on ajoute un retour à la ligne
\n
.
La garantie que les deux listes categories
et valeurs
ont la même longueur nous assure que la boucle s'exécute sans erreur.
Z