Présentation concise du module Collections

Beginner

This tutorial is from open-source community. Access the source code

Introduction

Le module collections fournit un certain nombre d'objets utiles pour la manipulation des données. Cette partie présente brièvement certaines de ces fonctionnalités.

Ceci est un Guided Lab, qui fournit des instructions étape par étape pour vous aider à apprendre et à pratiquer. Suivez attentivement les instructions pour compléter chaque étape et acquérir une expérience pratique. Les données historiques montrent que c'est un laboratoire de niveau intermédiaire avec un taux de réussite de 73%. Il a reçu un taux d'avis positifs de 100% de la part des apprenants.

Exemple : Compter des éléments

Disons que vous voulez tabuler le total des actions de chaque action.

portfolio = [
    ('GOOG', 100, 490.1),
    ('IBM', 50, 91.1),
    ('CAT', 150, 83.44),
    ('IBM', 100, 45.23),
    ('GOOG', 75, 572.45),
    ('AA', 50, 23.15)
]

Il y a deux entrées IBM et deux entrées GOOG dans cette liste. Les actions doivent être combinées de quelque manière.

Compteurs

Solution : Utiliser un Counter.

from collections import Counter
total_shares = Counter()
for name, shares, price in portfolio:
    total_shares[name] += shares

total_shares['IBM']     ## 150

Exemple : Mappages un-à-plusieurs

Problème : Vous voulez mapper une clé à plusieurs valeurs.

portfolio = [
    ('GOOG', 100, 490.1),
    ('IBM', 50, 91.1),
    ('CAT', 150, 83.44),
    ('IBM', 100, 45.23),
    ('GOOG', 75, 572.45),
    ('AA', 50, 23.15)
]

Comme dans l'exemple précédent, la clé IBM devrait avoir deux tuples différents.

Solution : Utiliser un defaultdict.

from collections import defaultdict
holdings = defaultdict(list)
for name, shares, price in portfolio:
    holdings[name].append((shares, price))
holdings['IBM'] ## [ (50, 91.1), (100, 45.23) ]

Le defaultdict assure que chaque fois que vous accédez à une clé, vous obtenez une valeur par défaut.

Exemple : Conserver une historique

Problème : Nous voulons une historique des N derniers éléments. Solution : Utiliser un deque.

from collections import deque

history = deque(maxlen=N)
with open(filename) as f:
    for line in f:
        history.append(line)
     ...

Le module collections est peut-être l'un des modules de bibliothèque les plus utiles pour traiter des problèmes de manipulation de données à usage spécifique tels que le tabulation et l'indexation.

Dans cet exercice, nous allons examiner quelques exemples simples. Commencez par exécuter votre programme report.py pour charger le portefeuille d'actions en mode interactif.

$ python3 -i report.py

Exercice 2.18 : Tabulation avec des Compteurs

Supposons que vous vouliez tabuler le nombre total d'actions de chaque action. C'est facile à faire avec des objets Counter. Essayez :

>>> portfolio = read_portfolio('portfolio.csv')
>>> from collections import Counter
>>> holdings = Counter()
>>> for s in portfolio:
        holdings[s['name']] += s['shares']

>>> holdings
Counter({'MSFT': 250, 'IBM': 150, 'CAT': 150, 'AA': 100, 'GE': 95})
>>>

Observez attentivement comment les multiples entrées pour MSFT et IBM dans portfolio sont combinées en une seule entrée ici.

Vous pouvez utiliser un Compteur tout comme un dictionnaire pour récupérer des valeurs individuelles :

>>> holdings['IBM']
150
>>> holdings['MSFT']
250
>>>

Si vous voulez classer les valeurs, faites ceci :

>>> ## Obtenez les trois actions les plus détenues
>>> holdings.most_common(3)
[('MSFT', 250), ('IBM', 150), ('CAT', 150)]
>>>

Prenons un autre portefeuille d'actions et créons un nouveau Compteur :

>>> portfolio2 = read_portfolio('portfolio2.csv')
>>> holdings2 = Counter()
>>> for s in portfolio2:
          holdings2[s['name']] += s['shares']

>>> holdings2
Counter({'HPQ': 250, 'GE': 125, 'AA': 50, 'MSFT': 25})
>>>

Enfin, combinons tous les portefeuilles en effectuant une simple opération :

>>> holdings
Counter({'MSFT': 250, 'IBM': 150, 'CAT': 150, 'AA': 100, 'GE': 95})
>>> holdings2
Counter({'HPQ': 250, 'GE': 125, 'AA': 50, 'MSFT': 25})
>>> combined = holdings + holdings2
>>> combined
Counter({'MSFT': 275, 'HPQ': 250, 'GE': 220, 'AA': 150, 'IBM': 150, 'CAT': 150})
>>>

Cela ne représente qu'un tout petit aperçu de ce que les Compteurs offrent. Cependant, si vous constatez que vous avez besoin de tabuler des valeurs, vous devriez envisager d'en utiliser un.

Commentaire : module collections

Le module collections est l'un des modules de bibliothèque les plus utiles de tout Python. En fait, on pourrait faire un tutoriel approfondi uniquement sur ce module. Cependant, le faire maintenant serait également une distraction. Pour l'instant, mettez collections sur votre liste de lectures pour le lit pour plus tard.

Sommaire

Félicitations ! Vous avez terminé le laboratoire sur le module Collections. Vous pouvez pratiquer d'autres laboratoires sur LabEx pour améliorer vos compétences.