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.
This tutorial is from open-source community. Access the source code
El módulo collections proporciona una serie de objetos útiles para el manejo de datos. Esta parte presenta brevemente algunas de estas características.
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.
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
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.
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
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.
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.
¡Felicitaciones! Has completado el laboratorio del módulo Collections. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.