Модуль Collections стандартной библиотеки Python – Counter, DefaultDict, OrderedDict, NamedTuple

В данной статье, посвященной модулю Collections из стандартной библиотеки Python, мы изучим следующие типы данных: Counter, DefaultDict, OrderedDict, и NamedTuple, включая их подтипы, синтаксис и примеры использования.

Итак, приступим!

Что такое модуль Collections из стандартной библиотеки Python?

В данном модуле стандартной библиотеки реализованы специальные imitation breitling bentley motors tourbillon motors tourbillon контейнерные типы данных. Они представляют собой альтернативу и дополнение встроенным в Python контейнерным типам данных.

Все они, кроме класса NamedTuple, унаследованы от класса dict, встроенного в Python.

from collections import Counter,defaultdict,OrderedDict,namedtuple
issubclass(Counter,dict) and issubclass(defaultdict,dict) and issubclass(OrderedDict,dict)

# Результат
# True
type(namedtuple)

# Результат
# <class ‘function’>

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

import collections

Давайте рассмотрим все эти типы данных по порядку.

Класс Counter из модуля Collections

Первым мы обсудим типа данных Counter из библиотеки Collections. Данный vape store toronto airport класс используется для подсчёта количества вхождений элементов в любые контейнеры. Подсчету подлежат только хэшируемые типы данных.

Рассмотрим примеры.

Синтаксис

Чтобы определить счетчик (экземпляр класса Counter) используется функция Counter(). В нее можно будет передать любой контейнер Python, например список, словарь, словарь или даже строку.

from collections import Counter
c = Counter({'a':3,'b':2,'c':1})
c

# Результат:
# Counter({‘a’: 3, ‘b’: 2, ‘c’: 1})
c = Counter('Hello')
c

# Результат
# Counter({‘l’: 2, ‘H’: 1, ‘e’: 1, ‘o’: 1})
c = Counter(a=3,b=2,c=1)
c

# Результат:
# Counter({‘a’: 3, ‘b’: 2, ‘c’: 1})

Обновление данных класса Counter

Можно объявить пустой счетчик (экземпляр класса Counter), а затем заполнить его при помощи метода update().

c = Counter()
c.update('bfg')
c

# Результат: 
# Counter({‘b’: 1, ‘f’: 1, ‘g’: 1})

Доступ к данным типа Counter

Доступ к данным типа Counter можно получить при помощи оператора индекса [].

c['f']

# Результат:
# 1

Заметим также, что в случае обращения к несуществующему индексу ошибка KeyError не выдается.

Также для доступа к данным можно воспользоваться методом elements(). Он возвращает итератор со значениями нашего контейнера.

for i in c.elements():
        print(f"{i}: {c[i]}")

# Результат:
# b: 1f: 1

# g: 1

Чтобы получить n наиболее часто встречающихся значение можно воспользоваться методом most_common():

c=Counter('hello')
c

# Результат
# Counter({‘l’: 2, ‘h’: 1, ‘e’: 1, ‘o’: 1})

c.most_common(2)

# Результат:
# [(‘l’, 2), (‘h’, 1)]

Арифметические операции с данными типа Counter

C данными типа Counter также можно производить некоторые арифметические операции:

c1 = Counter('hello')
c2 = Counter('help')
c1 + c2

# Результат
# Counter({‘l’: 3, ‘h’: 2, ‘e’: 2, ‘o’: 1, ‘p’: 1})

c1 & c2

# Результат:
# Counter({‘h’: 1, ‘e’: 1, ‘l’: 1})

Класс DefaultDict из модуля Collections

Класс DefaultDict из модуля Collections позволяет нам задать значение по умолчанию для всех ключей словаря. Это делается при помощи встроенной функции defaultdict(). Данная функция принимает в качестве аргумента другую функцию, при помощи которой и задается значение по умолчанию.

Синтаксис

Чтобы создать экземпляр класса DefaultDict мы используем встроенную функцию defaultdict().

from collections import defaultdict
d=defaultdict(lambda :35)
d['Ayushi']=95
d['Bree']=89
d['Leo']=90.5
d['Adam']

# Результат:
# 35

Как можно заметить, мы не инициализировали ключ "Adam" и поэтому ему было присвоено значение 35. Мы также можем проверить значение по умолчанию с помощью метода __missing__().

d.__missing__('Adam')

# Результат:
# 35

Реализация шаблона “фабрика”

Мы можем сообщить интерпретатору, с каким типом значений мы будем далее работать. Это можно сделать, передав тип данных в качестве аргумента в функцию defaultdict().

d = defaultdict(list)
for i,j in [('a',(1,2)),('b',(3,4)),('c',(5,6))]:
                d[i].append(j)
d

# Результат:
# 35

Класс OrderedDict из модуля Collections

Класс OrderedDict из модуля Collections запоминает в каком порядке в него добавляются элементы. Вот пример такого типа данных:

from collections import OrderedDict
o = OrderedDict()
o['a'] = 3
o['c'] = 1
o['b'] = 4
o

# Результат:
# OrderedDict([(‘a’, 3), (‘c’, 1), (‘b’, 4)])

Метод move_to_end()

Мы рассмотрим два метода из класса OrderedDict. И первый из них – это move_to_end(). Он дает нам возможность перемещать любую пару ключ-значение либо в начало коллекции, либо в ее конец.

o.move_to_end('c')
o

# Результат:
# OrderedDict([(‘a’, 3), (‘b’, 4), (‘c’, 1)])

o.move_to_end('c',last=False)
o

# Результат:
# OrderedDict([(‘c’, 1), (‘a’, 3), (‘b’, 4)])

Метод popitem()

Этот метод позволяет нам удалить пару ключ-значение из контейнера, а затем вывести ее на экран.

o.popitem()

# Результат:
# (‘b’, 4)

o.popitem(last=False)

# Результат:
# (‘c’, 1)

o

# Результат:
# OrderedDict([(‘a’, 3)])

Класс NamedTuple из модуля Collections

И наконец мы переходим к классу NamedTuple из модуля Collections. Это контейнер, который позволяет нам получать доступ к элементам, используя их имена.

from collections import namedtuple
colors = namedtuple('colors','r g b')
red = colors(r=255,g=0,b=0)

Доступ к элементам

Для доступа к элементам данного контейнера используется оператор точка (dot) ‘.‘.

red.r

# Результат:
# 255

Или мы можем использовать индексы:

red[0]

# Результат:
# 255

Также можно использовать функцию getattr():

getattr(red,'r')

# Результат:
# 255

Тип данных namedtuple (именованный кортеж) является неизменяемым. Поэтому напрямую его переопределить нельзя.

red.r=3
Traceback (most recent call last):
File "<pyshell#95>", line 1, in <module>
red.r=3

AttributeError: can’t set attribute

Преобразование в словарь Python

Для преобразования типа данных namedtuple (именованный кортеж) в словарь Python используется метод _asdict().

red._asdict()

# Результат:
# OrderedDict([(‘r’, 255), (‘g’, 0), (‘b’, 0)])

Преобразование итерируемой последовательности в namedtuple

Метод _make() позволяет нам создать тип данных namedtuple (именованный кортеж) из списка Python.

colors._make(['1','2','3'])

# Результат:
# colors(r=’1′, g=’2′, b=’3′)

Создание namedtuple (именованного кортежа) из словаря

Для создания namedtuple (именованного кортежа) можно использовать словарь:

colors(**{'r':255,'g':0,'b':0})

# Результат:
# colors(r=255, g=0, b=0)

Проверка полей на принадлежность к кортежу

Для этого существует атрибут _fields.

red._fields

# Результат:
# (‘r’, ‘g’, ‘b’)

Изменение значения

Как мы уже говорили, именованные кортежи Python неизменяемы. Но чтобы изменить значение, можно использовать метод _replace().

red._replace(g=3)

# Результат:
# colors(r=255, g=3, b=0)

На этом пока все, что мы хотели вам рассказать про модуль collections стандартной библиотеки Python. Надеемся, что вам понравилось!

Вопросы с собеседований по модулю collections стандартной библиотеки Python

  1. Что такое модуль collections стандартной библиотеки Python?
  2. Что такое контейнерные типы в Python?
  3. Как можно использовать тип Counter из модуля collections?
  4. Какие есть типы данных в модуле collections стандартной библиотеки Python?
  5. Являются ли строки контейнерами в Python?

Заключение

В данной статье мы кратко обсудили четыре класса, входящих в модуль collections стандартной библиотеки Python: Counter, defaultdict, OrderedDict, и namedtuple. Был разобран их синтаксис, методы и приведены примеры использования.

Перевод статьи Python Collections Module – Python Counter, DefaultDict, OrderedDict, NamedTuple.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Scroll to Top