Aller au contenu

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 :

🐍 Console Python
>>> 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 :

🐍 Console Python
>>> 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 :

🐍 Script Python
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

🐍 Console Python
>>> ajoute_espaces("Anne", 7)
"Anne   "
>>> ajoute_espaces("Luc", 7)
"Luc    "
>>> ajoute_espaces("nsi", 3)
"nsi"
>>> ajoute_espaces("", 2)
"  "
🐍 Console Python
>>> categories = ["Anne", "Luc", "Patrick", "Sam"]
>>> valeurs = [10, 8, 5, 15]
>>> print(barres(categories, valeurs))
Anne    : ##########
Luc     : ########
Patrick : #####
Sam     : ###############
🐍 Console Python
>>> categories = ["A", "B", "", "EEEEE"]
>>> valeurs = [1, 1, 0, 5]
>>> print(barres(categories, valeurs))
A     : #
B     : #
      : 
EEEEE : #####
bksl-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# Tests supplémentairesbksl-nlfor longueur in range(0, 20):bksl-nl assert ajoutepy-undespaces("abc", 3 + longueur) == "abc"+" " py-str \bksl-nl longueur, f"Erreur pour une longueur finale de taille {longueur}"bksl-nl assert ajoutepy-undespaces("", longueur) == " " py-str \bksl-nl longueur, f"Erreur pour une longueur finale de taille {longueur}"bksl-nlbksl-nlfor taille in range(1, 10):bksl-nl categories = ["a"py-strk for k in range(1, taille+1)]bksl-nl valeurs = list(range(1, taille+1))bksl-nl diagramme = "\n".join([ajoutepy-undespaces(bksl-nl categories[i], taille)+" : "+"#"py-strvaleurs[i] for i in range(taille)])+"\n"bksl-nl assert barres(categories, valeurs) == diagrammebksl-nlbksl-nl ∞/∞

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 indice i entre 0 et len(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

Retour en haut de la page