Introducción concisa al módulo Collections

Beginner

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

Introducción

El módulo collections proporciona una serie de objetos útiles para el manejo de datos. Esta parte presenta brevemente algunas de estas características.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel intermedio con una tasa de finalización del 73%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Ejemplo: Contando cosas

Digamos que quieres tabular las acciones totales de cada empresa.

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

Hay dos entradas de IBM y dos entradas de GOOG en esta lista. Las acciones deben combinarse de alguna manera.

Contadores

Solución: Utiliza un Counter.

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

total_shares['IBM']     ## 150

Ejemplo: Mapeos de Uno a Varios

Problema: Quieres mapear una clave a múltiples 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 en el ejemplo anterior, la clave IBM debería tener dos tuplas diferentes en lugar de eso.

Solución: Utiliza 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) ]

El defaultdict asegura que cada vez que accedes a una clave obtienes un valor predeterminado.

Ejemplo: Conservar un historial

Problema: Queremos un historial de las últimas N cosas. Solución: Utiliza un deque.

from collections import deque

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

El módulo collections podría ser uno de los módulos de biblioteca más útiles para tratar problemas de manipulación de datos con fines especiales, como la tabulación e indexación.

En este ejercicio, veremos algunos ejemplos simples. Comience ejecutando su programa report.py para que tenga la cartera de acciones cargada en el modo interactivo.

$ python3 -i report.py

Ejercicio 2.18: Tabulando con Contadores

Supongamos que quisieras tabular el número total de acciones de cada empresa. Esto es fácil usando objetos Counter. Intenta hacerlo:

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

Observa cuidadosamente cómo las múltiples entradas de MSFT y IBM en portfolio se combinan en una sola entrada aquí.

Puedes usar un Counter exactamente como un diccionario para recuperar valores individuales:

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

Si quieres clasificar los valores, haz esto:

>>> ## Obtener las tres empresas con más acciones
>>> holdings.most_common(3)
[('MSFT', 250), ('IBM', 150), ('CAT', 150)]
>>>

Tomemos otra cartera de acciones y creemos un nuevo 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, combinemos todas las carteras con una operación simple:

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

Esto es solo un pequeño ejemplo de lo que ofrecen los contadores. Sin embargo, si alguna vez te encuentras necesitando tabular valores, deberías considerar usar uno.

Comentario: módulo collections

El módulo collections es uno de los módulos de biblioteca más útiles de todo Python. De hecho, podríamos hacer un tutorial extenso solo sobre eso. Sin embargo, hacerlo ahora también sería una distracción. Por ahora, pon collections en tu lista de lectura antes de dormir para más adelante.

Resumen

¡Felicitaciones! Has completado el laboratorio del módulo Collections. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.