#!/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"])