Aller au contenu

Top-Likes !⚓︎

Sur le réseau social TipTop, on s'intéresse au nombre de « like » des abonnés. Les données sont stockées dans un dictionnaire où les clés sont les pseudos et les valeurs correspondantes sont les nombres de « like » comme ci-dessous :

🐍 Script Python
{'Bob': 102, 'Ada': 201, 'Alice': 103, 'Tim': 50}

Écrire une fonction top_likes qui :

  • prend en paramètre un dictionnaire likes non-vide dont les clés sont des chaines de caractères et les valeurs associées des entiers positifs ou nuls,

  • renvoie un tuple dont :

    • la première valeur est la clé du dictionnaire associée à la valeur maximale ; en cas d'égalité sur plusieurs clés, on choisira la plus petite suivant un classement alphabétique,
    • la seconde valeur est la valeur maximale présente dans le dictionnaire.

⚠ On interdit ici d'utiliser max, min, ainsi que sort ou sorted.

Exemples
🐍 Console Python
>>> top_likes({'Bob': 102, 'Ada': 201, 'Alice': 103, 'Tim': 50})
('Ada', 201)
>>> top_likes({'Alan': 222, 'Ada': 201, 'Eve': 222, 'Tim': 50})
('Alan', 222)
>>> top_likes({'David': 222, 'Ada': 201, 'Alan': 222, 'Tim': 50})
('Alan', 222)
>>> top_likes({'David': 0, 'Ada': 0, 'Alan': 0, 'Tim': 0})
('Ada', 0)
###
# Testsbksl-nlassert toppy-undlikes({"Bob": 102, "Ada": 201, "Alice": 103, "Tim": 50}) == ("Ada", 201)bksl-nlassert toppy-undlikes({"Alan": 222, "Ada": 201, "Eve": 222, "Tim": 50}) == ("Alan", 222)bksl-nlassert toppy-undlikes({"David": 222, "Ada": 201, "Alan": 222, "Tim": 50}) == ("Alan", 222)bksl-nlassert toppy-undlikes({"David": 0, "Ada": 0, "Alan": 0, "Tim": 0}) == ("Ada", 0)bksl-nlbksl-nl# Tests supplémentairesbksl-nlassert toppy-undlikes({"David": 12, "DaviD": 12, "david": 12}) == ("DaviD", 12)bksl-nlassert toppy-undlikes({"David": 1, "Charles": 2, "Bertrand": 3}) == ("Bertrand", 3)bksl-nlassert toppy-undlikes({"David": 1, "Bertrand": 3, "Charles": 2}) == ("Bertrand", 3)bksl-nlassert toppy-undlikes({"David": 10, "Bertrand": 3, "Charles": 2}) == ("David", 10)bksl-nlassert toppy-undlikes({"David": 0, "Ada": 0, "Alan": 0, "Tim": 0}) == ("Ada", 0)bksl-nlbksl-nl 5/5

def toppy-undlikes(likes):bksl-nl ...bksl-nlbksl-nlbksl-nl# Testsbksl-nlassert toppy-undlikes({"Bob": 102, "Ada": 201, "Alice": 103, "Tim": 50}) == ("Ada", 201)bksl-nlassert toppy-undlikes({"Alan": 222, "Ada": 201, "Eve": 222, "Tim": 50}) == ("Alan", 222)bksl-nlassert toppy-undlikes({"David": 222, "Ada": 201, "Alan": 222, "Tim": 50}) == ("Alan", 222)bksl-nlassert toppy-undlikes({"David": 0, "Ada": 0, "Alan": 0, "Tim": 0}) == ("Ada", 0)bksl-nlbksl-nldef toppy-undlikes(likes):bksl-nl maxpy-undpseudo = ""bksl-nl maxpy-undlikes = -1bksl-nl for pseudo in likes:bksl-nl if likes[pseudo] > maxpy-undlikes:bksl-nl maxpy-undpseudo = pseudobksl-nl maxpy-undlikes = likes[pseudo]bksl-nl elif likes[pseudo] == maxpy-undlikes and pseudo < maxpy-undpseudo:bksl-nl maxpy-undpseudo = pseudobksl-nl return (maxpy-undpseudo, maxpy-undlikes)bksl-nlbksl-nl

A

Il s'agit d'une recherche de maximum. On initialise le pseudo ayant le plus de « like » à "" et la variable max_likes à -1. On prend soin dès la première itération de la boucle de remplacer ces valeurs par celle associées au premier pseudo contenu dans le dictionnaire.

Lors du parcours de pseudos, on compare le nombre de « like » associé à la valeur conservée jusqu'à maintenant. Si elle est plus importante on met à jour. Si les nombres de « like » sont égaux, on ne met à jour que si l'on a aussi pseudo < max_pseudo.

Z