Краткое введение в модуль collections

Beginner

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

Введение

Модуль collections предоставляет ряд полезных объектов для обработки данных. В этой части кратко介绍руются некоторые из этих функций.

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня средний с процентом завершения 73%. Он получил 100% положительных отзывов от учащихся.

Пример: подсчет количества элементов

Допустим, вы хотите составить таблицу общих акций каждой компании.

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, чтобы улучшить свои навыки.