Модуль коллекций Python: Counter, ChainMap, Deque и Tuple
Опубликовано: 2020-12-01Модуль Python Collections предлагает набор типов данных контейнеров, которые расширяют возможности стандартных контейнеров, таких как списки, кортежи, наборы и словари. С этими специальными контейнерами у вас есть не только функции стандартных контейнеров, но и некоторые дополнительные методы, которые очень удобны для определенных задач.
К концу этого урока вы будете знать следующее:
- Что такое модуль коллекций?
- Различные функции, такие как:
- Прилавок
- ЦепьКарта
- Дек
- Именованный кортеж
- Рабочие примеры
Модуль Collections предустановлен в Python, поэтому нам не нужно его устанавливать. Мы можем просто импортировать его, и вы готовы к работе! Давайте подробно рассмотрим наиболее часто используемые функции.
Учитесь изучать науку о данных в лучших университетах мира. Участвуйте в программах Executive PG, Advanced Certificate Programs или Master Programs, чтобы ускорить свою карьеру.
Обязательно к прочтению: Увлекательные приложения Python в реальном мире
Оглавление
Прилавок
Счетчик — это, пожалуй , самая используемая и самая полезная функция в модуле «Коллекции». Счетчик — это подкласс класса словаря в Python. Он подсчитывает количество вхождений каждого элемента в итерируемом объекте (например, строки, кортежи, списки и т. д.) и сохраняет его в словаре. Ключи словаря — это уникальные элементы в итерации, а значения — это количество этих элементов.
Давайте попробуем это на некоторых примерах.
Импорт коллекций Marvel = «Плохой Росомаха издевался над бедным Железным Человеком, плохой Росомаха, бедный, бедный Железный Человек» Marvel_count = collections.Counter(Marvel.split()) |
#Выход: Счетчик({ 'Плохо' : 3 , «Железо» : 2 , «Человек» : 2 , «Бедный» : 2 , «Росомаха» : 2 , 'обидел' : 1 }) |
Как мы видим, он подсчитал вхождения каждого элемента и поместил их в словарь. Это можно использовать в любом типе итерации. Теперь давайте посмотрим, какие у него есть методы.
Marvel_count[ 'Плохо' ] #>> 3 Marvel_count.values() #>> dict_values([3, 2, 1, 2, 2, 2]) Marvel_count.keys() #>> dict_keys(['Плохой', 'Росомаха', 'обиженный', 'Железный', 'Мужчина', 'Бедный']) |
Метод most_common(n) возвращает список из n наиболее распространенных элементов, расположенных в порядке убывания количества.
Marvel_count.most_common( 2 ) #>> [('Плохой', 3), ('Росомаха', 2)] |
ЦепьКарта
ChainMap используется для создания единого представления многих словарей, чтобы к ним можно было получить доступ и обновить их из единого представления, т.е. самого объекта ChainMap. Имейте в виду, что эти ChainMaps состоят только из ссылок на фактические словари, и обновление также выполняется в самих словарях.
ChainMap является расширением класса словаря, поэтому поддерживаются все методы словаря, а также несколько дополнительных методов, которые мы рассмотрим.
dic1 = { 'а' : 1 , 'б' : 2 } dic2 = { 'b' : 3 , 'c' : 4 } Dic3 = { 'b' : 9 , 'd' : 4 } chain1 = collections.ChainMap(dic2, dic1) цепь1 |
В приведенном выше коде мы определяем два словаря dic1 и dic2 и помещаем их в объект ChainMap.
#Выход: ChainMap({ 'b' : 3 , 'c' : 4 }, { 'a' : 1 , 'b' : 2 }) |
Как мы видим, dic2 «сцеплен» с dic1 именно в таком порядке. По сути, вы можете представить, что dic2 подключен к dic1, как dic2->dic1. Поэтому, когда мы ищем ключ «b», он сначала будет искать в первом сопоставлении, которое является dic2, и, если ключ не найден, он перейдет к следующим сопоставлениям.
Поэтому порядок ChainMap важен для определения того, какое сопоставление ищется первым. Давайте посмотрим, что в действии.
цепочка1 [ 'б' ] #>> 3 |
Как мы видим, выше ChainMap имеет ключ «b» в обоих словарях. Поэтому, когда мы ищем ключ «b», он ищет в первом отображении, которое является dic2, и возвращает значение.
атрибут карты
Атрибут карты ChainMap возвращает список отображений в порядке поиска, т. е. dic2 находится первым в карте, поэтому он будет искаться первым и так далее.
chain1.maps #>> [{'b': 3, 'c': 4}, {'a': 1, 'b': 2}] |
Точно так же мы можем проверить ключи и значения:
список (chain1.keys()) #>> ['а', 'с', 'б'] |
список (цепочка1.значения()) #>> [1, 4, 3] |
Как мы видим, показаны только уникальные ключи и значения.
new_child (м = нет)
Метод new_child() используется для добавления новых карт в ChainMap. Этот метод возвращает новую карту ChainMap с новой картой в качестве первой карты, за которой следуют остальные карты. Если указано m, оно становится первой картой, в противном случае в качестве первой карты добавляется пустой словарь.
chain1.new_child(dic3) chain1.maps |
#Выход: [{ 'b' : 9 , 'd' : 4 }, { 'b' : 3 , 'c' : 4 }, { 'a' : 1 , 'b' : 2 }] |
Как мы видим, он добавил dic3 в начале и вернул новый объект ChainMap.
перевернутый
Вам может быть интересно, как вы можете изменить порядок ChainMap. Этого можно добиться с помощью функции reversed, которая возвращает итератор для перебора ChainMap в обратном направлении. Давайте посмотрим на это в действии.
Клавиша 'b' теперь есть на всех картах. Первая карта в ChainMap имеет ключ «b» со значением 9.
цепочка1 [ 'б' ] #>> 9 |
Давайте посмотрим, что произойдет, когда мы повторим в обратном направлении.
chain1.maps = обратный (chain1.maps) цепочка1 [ 'б' ] #>> 2 |
Имейте в виду, что обратная функция на самом деле не меняет отображение, она просто дает обратный итератор.
Читайте: Учебник по Python
Дек
Deque (произносится как «колода» ) — это расширение списков, но двустороннее. Deque означает: Double Ended Queue, потому что мы можем эффективно удалять/извлекать и добавлять элементы на любом конце Deque, в отличие от списков, где все операции находятся с правой стороны.
deque(iterable, maxlen) принимает итерируемые объекты и возвращает объекты deque. У них также есть параметр maxlen, который определяет верхний предел количества элементов. Если не указано, двухсторонняя очередь может расти бесконечно. Давайте посмотрим на его быстрые методы.

deq = collections.deque([ 1 , 2 , 3 , 4 , 5 ], maxlen= 6 ) deq.appendleft( 8 ) |
#Выход: двойная очередь ([ 8 , 1 , 2 , 3 , 4 , 5 ]) |
Как мы видим, вызов метода appendleft добавляет элемент к левому концу. Более того, поскольку мы инициализировали его с maxlen равным 6, которого он достиг сейчас, добавление другого элемента вызовет «StopIterationError».
Итак, давайте удалим самый левый элемент с помощью popleft :
deq.popleft() #>> 8 |
Мы также можем удалить определенный элемент по значению, используя команду remove:
deq.remove( 5 ) #>> deque([1, 2, 3, 4]) |
Примечание: вызов метода удаления с элементом, которого нет в двухсторонней очереди, вызовет «ValueError».
Мы можем вставить любой элемент по указанному индексу, используя insert(index, element) .
deq.insert( 2 , 7 ) #>> deque([1, 2, 7, 3, 4]) |
Deque можно отменить, вызвав метод reverse .
deq.reverse() #>> deque([4, 3, 7, 2, 1]) |
Deque также можно вращать по часовой стрелке или против часовой стрелки, используя метод поворота .
#по часовой стрелкеdeq.rotate( 2 )#>> deque([2, 1, 4, 3, 7]) |
#Против часовой стрелкиdeq.rotate( -2 )#>> deque([4, 3, 7, 2, 1]) |
Именованный кортеж
namedtuple() — это отличное улучшение обычного объекта кортежа в Python. Именованные кортежи позволяют нам индексировать элементы по их именам, а не только по позициям. Вы можете думать об именованных кортежах как о таблицах с именем таблицы в качестве имени кортежа и именами столбцов в качестве имен индексов. Именованный кортеж, по сути, присваивает значение каждому элементу для более легкого доступа и более читаемого кода.
Давайте возьмем несколько примеров и поймем, как это работает.
Performance = collections.namedtuple( 'Employee_Rating' , [ 'Q1' , 'Q2' , 'Q3' , 'Q4' ]) |
В приведенном выше коде мы определили объект Named Tuple «Производительность» с именем «Employee_Rating» с именами полей «Q1», «Q2», «Q3» и «Q4», в которых будут храниться ежеквартальные рейтинги сотрудников. Давайте создадим 2 именованных записи кортежа Employee_Rating.
рахул = производительность ( 3 , 4 , 3,5 , 4,5 ) анкит = Производительность ( 4 , 4.5 , 4 , 4.5 ) |
#Выход: Employee_Rating (Q1 = 4 , Q2 = 4,5 , Q3 = 4 , Q4 = 4,5 ) Employee_Rating (Q1 = 3 , Q2 = 4 , Q3 = 3,5 , Q4 = 4,5 ) |
Теперь, когда мы создали 2 записи, мы можем получить к ним доступ по именам индексов.
Анкит.Q1 #>> 4 |
анкит.Q3 > рахул.Q3 #>> Верно |
Чтобы добавить новые записи или создать новые именованные объекты кортежа, мы можем использовать метод _make() .
Милха = Performance._make([ 4 , 5 , 5 , 4.5 ]) Милха |
#Выход: Employee_Rating (Q1 = 4 , Q2 = 5 , Q3 = 5 , Q4 = 4,5 ) |
Мы можем редактировать элементы, используя метод _replace для любого именованного кортежа.
рахул._заменить (Q1 = 2 ) |
#Выход: Employee_Rating (Q1 = 2 , Q2 = 4 , Q3 = 3,5 , Q4 = 4,5 ) |
Прежде чем ты уйдешь
В модуле «Коллекции» есть еще несколько полезных функций, таких как OrderedDict, defaultdict, UserList, UserString, UserDict. Убедитесь, что вы освоили функции, которые мы обсуждали в этом руководстве. Эти типы контейнеров не только облегчают вашу жизнь, но и улучшают качество кода, который вы пишете.
Если вам интересно узнать о python и науке о данных, ознакомьтесь с программой Executive PG IIIT-B и upGrad по науке о данных , которая создана для работающих профессионалов и предлагает более 10 тематических исследований и проектов, практические практические семинары, наставничество с отраслевыми экспертами. , общение один на один с отраслевыми наставниками, более 400 часов обучения и помощь в трудоустройстве в ведущих фирмах.
Что такое модуль коллекции и чем он полезен?
Модуль коллекции Python поддерживает несколько типов контейнеров. Контейнер — это объект, используемый для хранения различных элементов и предоставления средств для извлечения и повторения вложенных объектов. Доступны кортеж, список, словарь и другие встроенные контейнеры. Кроме того, модуль Collections имеет узкоспециализированные и эффективные типы данных контейнеров, такие как namedtuple(), deque, OrderedDict, counter и т. д., которые намного превосходят стандартные контейнеры Python.
Является ли модуль коллекции необходимой темой для Python?
Да, модуль коллекции — необходимая тема при изучении Python. Подсчет объектов, построение очередей и стеков, управление отсутствующими ключами в словарях и многое другое возможно с модулем коллекций Python. Типы данных и классы коллекций созданы, чтобы быть эффективными и Pythonic. Они очень ценны для вашей карьеры программиста на Python, поэтому время, потраченное на изучение этого модуля коллекции, стоит вашего времени и усилий. Контейнеры в модуле «Коллекции» могут оказаться весьма полезными для проектов и моделей бизнес-уровня, значительно увеличивая полезность общих контейнеров Python за счет улучшенной оптимизации и скорости выполнения.
Какие типы данных присутствуют в модуле коллекции?
В модуле коллекции присутствует несколько типов данных, таких как deque, defaultdict, namedtuple, OrderedDict, Counter, ChainMap, UserDict, UserList, UserString и т. д. Эти типы данных могут использоваться по разным причинам, например, для добавления и удаления элементов из любой конец последовательности, создавая значения по умолчанию для отсутствующих ключей и автоматически добавляя их в словарь. Эти типы данных также могут помочь, предоставляя именованные поля, которые позволяют получать доступ к элементам по имени, сохраняя при этом возможность доступа к элементам по индексу, подсчитывая уникальные элементы в последовательности или итерации, а также обрабатывая несколько сопоставлений как один объект словаря и т. д.