В этой главе мы изучим модуль под названием Collections. Этот модуль реализует некоторые удобные структуры данных, которые помогут вам решать различные задачи из реальной жизни.

Counter

Counter — это подкласс словаря, который помогает подсчитывать хешируемые объекты. Внутри элементы хранятся как ключи словаря, а их количества — как значения, которые могут быть нулевыми или отрицательными.

Ниже мы рассмотрим пример, где найдем вхождения слов в файле LICENSE Python.

Пример Counter

>>> from collections import Counter
>>> import re
>>> path = '/usr/share/doc/python-2.7.3/LICENSE'
>>> words = re.findall('\w+', open(path).read().lower())
>>> Counter(words).most_common(10)
[('2', 97), ('the', 80), ('or', 78), ('1', 76), ('of', 61), ('to', 50), ('and', 47), ('python', 46), ('psf', 44), ('in', 38)]

Объекты Counter имеют метод под названием elements, который возвращает итератор по элементам, повторяя каждый столько раз, сколько его количество. Элементы возвращаются в произвольном порядке.

>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> list(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']

most_common — это метод, который возвращает наиболее часто встречающиеся элементы и их количества от наиболее к наименее частым.

>>> Counter('abracadabra').most_common(3)
[('a', 5), ('r', 2), ('b', 2)]

Пример Counter

>>> from collections import Counter
>>> import re
>>> path = '/usr/share/doc/python-2.7.3/LICENSE'
>>> words = re.findall('\w+', open(path).read().lower())
>>> Counter(words).most_common(10)
[('2', 97), ('the', 80), ('or', 78), ('1', 76), ('of', 61), ('to', 50), ('and', 47), ('python', 46), ('psf', 44), ('in', 38)]

Объекты Counter имеют метод под названием elements, который возвращает итератор по элементам, повторяя каждый столько раз, сколько его счет. Элементы возвращаются в произвольном порядке.

>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> list(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']

most_common — это метод, который возвращает наиболее часто встречающиеся элементы и их количество от наиболее к наименее часто встречающимся.

>>> Counter('abracadabra').most_common(3)
[('a', 5), ('r', 2), ('b', 2)]

defaultdict

defaultdict — это объект, похожий на словарь, который предоставляет все методы, предоставляемые словарем, но принимает первый аргумент (default_factory) в качестве типа данных по умолчанию для словаря. Использование defaultdict быстрее, чем выполнение того же самого с помощью метода dict.set_default.

Пример использования defaultdict

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

В примере видно, что даже если ключ отсутствует в объекте defaultdict, он автоматически создает пустой список. Затем list.append помогает добавить значение в список.

пример defaultdict

>>> s = [('желтый', 1), ('синий', 2), ('желтый', 3), ('синий', 4), ('красный', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> d.items()
[('синий', [2, 4]), ('красный', [1]), ('желтый', [1, 3])]

В этом примере видно, что даже если ключ отсутствует в объекте defaultdict, он автоматически создает пустой список. list.append затем помогает добавить значение в список.

namedtuple

Именованные кортежи помогают придать каждой позиции в кортеже смысл и позволяют писать код с лучшей читаемостью и самодокументируемым кодом. Их можно использовать в любом месте, где вы используете кортежи. В примере мы создадим именованный кортеж для хранения информации о точках.

Именованный кортеж

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])  # Определение именованного кортежа
>>> p = Point(10, y=20)  # Создание объекта
>>> p
Point(x=10, y=20)
>>> p.x + p.y
30
>>> p[0] + p[1]  # Доступ к значениям обычным способом
30
>>> x, y = p     # Распаковка кортежа
>>> x
10
>>> y
20

Именованный кортеж

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])  # Определение именованного кортежа
>>> p = Point(10, y=20)  # Создание объекта
>>> p
Point(x=10, y=20)
>>> p.x + p.y
30
>>> p[0] + p[1]  # Доступ к значениям обычным способом
30
>>> x, y = p     # Распаковка кортежа
>>> x
10
>>> y
20

Перейти к следующему уроку →