Introdução Concisa ao Módulo Collections

Beginner

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

Introdução

O módulo collections fornece vários objetos úteis para manipulação de dados. Esta seção introduz brevemente algumas dessas funcionalidades.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível intermediário com uma taxa de conclusão de 73%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Exemplo: Contando Coisas

Digamos que você queira tabular o total de ações de cada ação.

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)
]

Existem duas entradas IBM e duas entradas GOOG nesta lista. As ações precisam ser combinadas de alguma forma.

Contadores (Counters)

Solução: Use um Counter.

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

total_shares['IBM']     ## 150

Exemplo: Mapeamentos Um-Muitos

Problema: Você quer mapear uma chave para múltiplos valores.

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)
]

Como no exemplo anterior, a chave IBM deve ter duas tuplas diferentes em vez disso.

Solução: Use um 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) ]

O defaultdict garante que toda vez que você acessa uma chave, você obtém um valor padrão.

Exemplo: Mantendo um Histórico

Problema: Queremos um histórico das últimas N coisas. Solução: Use um deque.

from collections import deque

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

O módulo collections pode ser um dos módulos de biblioteca mais úteis para lidar com tipos especiais de problemas de manipulação de dados, como tabulação e indexação.

Neste exercício, veremos alguns exemplos simples. Comece executando seu programa report.py para que você tenha o portfólio de ações carregado no modo interativo.

$ python3 -i report.py

Exercício 2.18: Tabulação com Contadores

Suponha que você queira tabular o número total de ações de cada ação. Isso é fácil usando objetos Counter. Tente:

>>> 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})
>>>

Observe cuidadosamente como as múltiplas entradas para MSFT e IBM em portfolio são combinadas em uma única entrada aqui.

Você pode usar um Counter como um dicionário para recuperar valores individuais:

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

Se você quiser classificar os valores, faça o seguinte:

>>> ## Obter as três ações mais detidas
>>> holdings.most_common(3)
[('MSFT', 250), ('IBM', 150), ('CAT', 150)]
>>>

Vamos pegar outro portfólio de ações e criar um novo Counter:

>>> 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})
>>>

Finalmente, vamos combinar todas as participações fazendo uma operação simples:

>>> 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})
>>>

Este é apenas um pequeno exemplo do que os contadores fornecem. No entanto, se você precisar tabular valores, deve considerar o uso de um.

Comentário: módulo collections

O módulo collections é um dos módulos de biblioteca mais úteis em todo o Python. Na verdade, poderíamos fazer um tutorial estendido apenas sobre isso. No entanto, fazê-lo agora também seria uma distração. Por enquanto, coloque collections na sua lista de leitura para mais tarde.

Resumo

Parabéns! Você concluiu o laboratório do Módulo Collections. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.