Введение
Модуль collections предоставляет ряд полезных объектов для обработки данных. В этой части кратко介绍руются некоторые из этих функций.
Пример: подсчет количества элементов
Допустим, вы хотите составить таблицу общих акций каждой компании.
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)
]
В этом списке есть две записи для IBM и две записи для GOOG. Акции нужно как-то объединить.
Счетчики
Решение: используйте Counter.
from collections import Counter
total_shares = Counter()
for name, shares, price in portfolio:
total_shares[name] += shares
total_shares['IBM'] ## 150
Пример: отображения "один - много"
Проблема: вы хотите сопоставить ключ с несколькими значениями.
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)
]
Как и в предыдущем примере, вместо этого ключ IBM должен иметь два разных кортежа.
Решение: используйте 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) ]
defaultdict гарантирует, что каждый раз, когда вы обращаетесь к ключу, вы получаете значение по умолчанию.
Пример: сохранение истории
Проблема: нам нужно сохранить историю последних N элементов. Решение: используйте deque.
from collections import deque
history = deque(maxlen=N)
with open(filename) as f:
for line in f:
history.append(line)
...
Модуль collections может быть одним из самых полезных библиотечных модулей для решения специальных типов задач обработки данных, таких как составление таблиц и индексирование.
В этом упражнении мы рассмотрим несколько простых примеров. Начните с запуска программы report.py, чтобы в интерактивном режиме были загружены портфель акций.
$ python3 -i report.py
Упражнение 2.18: Составление таблиц с помощью счетчиков
Предположим, вы хотите составить таблицу общего количества акций каждой компании. Это легко сделать с использованием объектов Counter. Попробуйте:
>>> 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})
>>>
Обратите внимание, как несколько записей для MSFT и IBM в portfolio объединяются в одну запись здесь.
Вы можете использовать Counter точно так же, как и словарь, чтобы получить отдельные значения:
>>> holdings['IBM']
150
>>> holdings['MSFT']
250
>>>
Если вы хотите отсортировать значения, сделайте это так:
>>> ## Получить три наиболее популярных акции
>>> holdings.most_common(3)
[('MSFT', 250), ('IBM', 150), ('CAT', 150)]
>>>
Возьмем другой портфель акций и создадим новый 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})
>>>
Наконец, давайте объединим все портфели с помощью простой операции:
>>> 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})
>>>
Это всего лишь малая часть того, что предоставляют счетчики. Однако, если вы когда-нибудь обнаружите, что нуждаетесь в составлении таблиц значений, стоит рассмотреть использование счетчиков.
Комментарий: модуль collections
Модуль collections является одним из самых полезных библиотечных модулей в целом Python. Фактически, мы могли бы сделать расширенный туториал только об этом. Однако, сделать это сейчас также было бы отвлечением. Временно поместите collections в список книг для чтения перед сном для дальнейшего изучения.
Резюме
Поздравляем! Вы завершили лабораторную работу по модулю Collections. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.