#!/usr/bin/env python # coding: utf-8 # # Dixième exercice en Python (Niveau Lycée) # # *Résumé en français* : On vous donne une liste contenant des **couleurs** de **moufles** (donc pas de main gauche ou droite à distinguer). On vous demande le **nombre de paires** que vous pouvez **constituer**, c'est-à-dire avoir **2 moufles de la même couleur**. # Avec le **premier exemple** donné, on peut constituer une **paire** de moufles **rouge** (red) **et** une paire **bleue** (blue) soit **2 paires**. # ## Version classique # Relisez l'exercice 6 que j'ai proposé, vous devriez constater de nombreuses ressemblances. # # Une **première idée** est de commencer par **récupérer les différentes** couleurs puis, **pour chacune d'elle**, de compter **combien de fois** cette **couleur apparait**. Il suffira de **diviser par 2** ce nombre (sans tenir compte des virgules) pour savoir **combien de paires** on peut **constituer** avec cette couleur. Finalement, on fera la **somme** du **nombre de paires** trouvées. # Je reprends la **structure classique** vue dans l'exercice 6 : # In[1]: def nb_paires(gants): couleurs = [ ] # couleurs distinctes for g in gants: # on parcourt les gants if g not in couleurs: # nouvelle couleur ? couleurs.append(g) # on l'ajoute à la liste paires = 0 # nombre de paires possibles for c in couleurs: # on parcourt à nouveau les gants paires += gants.count(c) // 2 # on compte puis ÷ entière par 2 return paires # on renvoie le nombre de paires # In[2]: nb_paires(["gray","black","purple","purple","gray","black"]) # In[3]: nb_paires(["red","green","blue"]) # ## Version ensembliste # Comme nous l'avons également vu dans l'exercice 6, nous pouvons utiliser des **ensembles** (`set`) pour récupérer les éléments **uniques**. Les versions sont alors nettement plus courtes : # In[4]: def nb_paires(gants): return sum(gants.count(v) // 2 for v in set(gants)) # In[5]: nb_paires(["gray","black","purple","purple","gray","black"]) # ## Version utilisant une seule boucle et une pile # Est-il vraiment nécessaire de récupérer les couleurs uniques ? Imaginons la situation dans la **vie réelle** avec `'red' 'green' 'red' 'blue' 'blue'` : # # - Dans ma tête je pense à **0**, c'est le **nombre de paires** que j'ai réussi à faire # - Je prends le **premier** gant, il est `'red'`, je n'ai pas cette couleur donc je la garde # - Je prends le **deuxième**, il est `'green'`, je n'ai pas cette couleur donc je la garde # - Je prends le **troisième**, il est `'red'`. J'ai déjà cette couleur, je peux donc faire une **paire**. **J'enlève** les 2 moufles 'red' et **j'ajoute 1** au nombre de paires # - Je prends le **quatrième**, il est `'blue'`, je n'ai pas cette couleur donc je la garde # - Je prends le **cinquième**, il est `'blue'`. J'ai déjà cette couleur, je peux donc faire une **paire**. J'enlève les 2 moufles 'blue' et **j'ajoute 1** au nombre de paires # - J'ai finalement réussi à constituer **2 paires**. # 🤖 Refaites de tête le processus avec les gants `'red' 'red' 'red' 'red' 'red'` # **Prendre** un gant revient à **ajouter** un élément dans une liste, inversement **créer** une **paire** à **éliminer** cette couleur de la liste. Voyons comment ajouter, enlever ou tester si un élément est dans un ensemble en utilisant les méthodes `add`, `remove` : # In[7]: paires = set() # Ensemble vide paires.add('red') # on ajoute 'red' à l'ensemble paires # In[8]: paires.add('blue') paires # In[9]: paires.remove('red') # on enlève 'red' paires # In[10]: 'red' in paires # on teste si 'red' est dans l'ensemble # Version finale basée sur cette idée : # In[11]: def nb_paires(gants): couleurs = set() # les couleurs trouvées paires = 0 # nb de paires réalisées for c in gants: # on parcourt les gants if c in couleurs: # couleur déjà vue ? couleurs.remove(c) # on la retire des couleurs trouvées paires += 1 # le nombre de paires augmente de 1 else: # sinon couleurs.add(c) # ajouter cette nouvelle couleur return paires # nombre de paires trouvées # In[12]: nb_paires(["gray","black","purple","purple","gray","black"])