Введение в модуль коллекций Python

Введение Коллекции в Python - это контейнеры, которые используются для хранения коллекций данных, например list, dict, set, tuple и т. Д. Это встроенные коллекции. Было разработано несколько модулей, которые предоставляют дополнительные структуры данных для хранения коллекций данных. Одним из таких модулей является модуль коллекций Python [https://docs.python.org/2/library/collections.html]. Модуль коллекций Python был представлен для улучшения функциональности встроенных контейнеров коллекции. Python col

Вступление

Коллекции в Python - это контейнеры, которые используются для хранения коллекций данных, например list, dict, set, tuple и т. Д. Это встроенные коллекции. Было разработано несколько модулей, которые предоставляют дополнительные структуры данных для хранения коллекций данных. Одним из таких модулей является модуль коллекций Python.

Модуль коллекций Python был представлен для улучшения функциональности встроенных контейнеров коллекции. Модуль коллекций Python был впервые представлен в версии 2.4. Это руководство основано на его последней стабильной версии (версия 3.7).

Модуль Коллекции

В этом руководстве мы обсудим 6 наиболее часто используемых структур данных из модуля коллекций Python. Вот они:

Счетчик

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

Перед созданием экземпляра counter необходимо импортировать Counter

 from collections import Counter 
Создать объекты счетчика

Есть несколько способов создания объектов counter Самый простой способ

  • использовать Counter() без аргументов.

    cnt = Counter()

Вы можете передать итерацию (список) в Counter() чтобы создать объект counter

 list = [1,2,3,4,1,2,6,7,3,8,1] 
 Counter(list) 

Наконец, Counter() может принимать словарь в качестве аргумента. В этом словаре значение ключа должно быть «счетчиком» этого ключа.

 Counter({1:3,2:4}) 

Вы можете получить доступ к любому элементу счетчика с его ключом, как показано ниже:

 list = [1,2,3,4,1,2,6,7,3,8,1] 
 cnt = Counter(list) 
 print(cnt[1]) 

когда вы напечатаете cnt[1] , вы получите счет 1.

Выход:

 3 

В приведенных выше примерах cnt - это объект Counter который является подклассом dict . Итак, в нем есть все методы класса dict

Кроме того, Counter имеет три дополнительных функции:

  1. Элементы
  2. Most_common ([n])
  3. Вычесть ([interable-or-mapping])
Функция element ()

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

Взгляните на следующий пример:

 cnt = Counter({1:3,2:4}) 
 print(list(cnt.elements())) 

Выход:

 [1, 1, 1, 2, 2, 2, 2] 

Здесь мы создаем Counter со словарем в качестве аргумента. В этом объекте Counter счетчик 1 равен 3, а счетчик 2 равен 4. Функция elements() вызывается с использованием cnt который возвращает итератор, который передается в качестве аргумента в список.

Итератор повторяет 3 раза в течение 1, возвращая три '1', и повторяется четыре раза для 2, возвращая в список четыре '2'. Наконец, список распечатывается с помощью функции print

Функция most_common ()

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

 list = [1,2,3,4,1,2,6,7,3,8,1] 
 cnt = Counter(list) 
 print(cnt.most_common()) 

Выход:

 [(1, 3), (2, 2), (3, 2), (4, 1), (6, 1), (7, 1), (8, 1)] 

Вы можете видеть, что most_common возвращает список, который отсортирован по количеству элементов. 1 имеет счетчик три, поэтому это первый элемент списка.

Функция subtract ()

subtract() принимает в качестве аргумента итерацию (список) или отображение (словарь) и вычитает количество элементов, используя этот аргумент. Посмотрите следующий пример:

 cnt = Counter({1:3,2:4}) 
 deduct = {1:1, 2:2} 
 cnt.subtract(deduct) 
 print(cnt) 

Выход:

 Counter({1: 2, 2: 2}) 

Вы можете заметить, что cnt мы создали первым, имеет счетчик 3 для «1» и счетчик 4 для «2». deduct имеет значение «1» для ключа «1» и значение «2» для ключа «2». Функция subtract() вычитала 1 отсчет из клавиши «1» и 2 отсчета из клавиши «2».

Defaultdict

defaultdict работает точно так же, как словарь Python, за исключением того, что он не KeyError при попытке доступа к несуществующему ключу.

Вместо этого он инициализирует ключ с элементом типа данных, который вы передаете в качестве аргумента при создании defaultdict . Тип данных называется default_factory .

Импортировать defaultdict

Во-первых, вы должны импортировать defaultdict из collections перед его использованием:

 from collections import defaultdict 
Создать defaultdict

Вы можете создать defaultdict с помощью конструктора defaultdict() . Вы должны указать тип данных в качестве аргумента. Проверьте следующий код:

 nums = defaultdict(int) 
 nums['one'] = 1 
 nums['two'] = 2 
 print(nums['three']) 

Выход:

 0 

В этом примере int передается как default_factory . Обратите внимание, что вы передаете только int , а не int() . Затем значения определяются для двух ключей, а именно «один» и «два», но в следующей строке мы пытаемся получить доступ к ключу, который еще не был определен.

В обычном словаре это вызовет KeyError . Но defaultdict инициализирует новый ключ значением default_factory умолчанию, равным 0 для int . Следовательно, когда программа будет выполнена, будет напечатан 0. Эта особенность инициализации несуществующих ключей может использоваться в различных ситуациях.

Например, предположим, что вы хотите подсчитать каждое имя в списке имен, указанном как «Майк, Джон, Майк, Анна, Майк, Джон, Джон, Майк, Майк, Бритни, Смит, Анна, Смит».

 from collections import defaultdict 
 
 count = defaultdict(int) 
 names_list = "Mike John Mike Anna Mike John John Mike Mike Britney Smith Anna Smith".split() 
 for names in names_list: 
 count[names] +=1 
 print(count) 

Выход:

 defaultdict(<class 'int'>, {'Mike': 5, 'Britney': 1, 'John': 3, 'Smith': 2, 'Anna': 2}) 

Сначала мы создаем defaultdict с int как default_factory . В names_list входит набор имен, которые повторяются несколько раз. Функция split() возвращает список из заданной строки. Он разбивает строку всякий раз, когда встречается пробел, и возвращает слова как элементы списка. В цикле каждый элемент в списке добавляется к defaultdict именем count и инициализируется значением 0 на основе default_factory . Если тот же элемент встречается снова, по мере продолжения цикла, счетчик этого элемента будет увеличиваться.

OrderedDict

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

Импортировать OrderedDict

Чтобы использовать OrderedDict вам необходимо импортировать его из модуля коллекций.

 from collections import OrderedDict 
Создать OrderedDict

Вы можете создать объект OrderedDict() . В следующем коде вы создаете OrderedDict без каких-либо аргументов. После этого в него вставляются какие-то предметы.

 od = OrderedDict() 
 od['a'] = 1 
 od['b'] = 2 
 od['c'] = 3 
 print(od) 

Выход:

 OrderedDict([('a', 1), ('b', 2), ('c', 3)]) 

Вы также можете получить доступ к каждому элементу с помощью цикла. Взгляните на следующий код:

 for key, value in od.items(): 
 print(key, value) 

Выход:

 a 1 
 b 2 
 c 3 

Следующий пример представляет собой интересный вариант использования OrderedDict с Counter . Здесь мы создаем Counter из списка и вставляем элемент в OrderedDict на основе их количества.

Наиболее часто встречающаяся буква будет вставлена в качестве первого ключа, а наименее часто встречающаяся буква будет вставлена в качестве последнего ключа.

 list = ["a","c","c","a","b","a","a","b","c"] 
 cnt = Counter(list) 
 od = OrderedDict(cnt.most_common()) 
 for key, value in od.items(): 
 print(key, value) 

Выход:

 a 4 
 c 3 
 b 2 

Дека

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

Импортировать двухстороннюю очередь

Перед использованием необходимо импортировать класс deque collections

 from collections import deque 
Создание двухсторонней очереди

Вы можете создать двухстороннюю очередь с конструктором deque() . Вы должны передать список в качестве аргумента.

 list = ["a","b","c"] 
 deq = deque(list) 
 print(deq) 

Выход:

 deque(['a', 'b', 'c']) 
Вставка элементов в deque

Вы можете легко вставить элемент в deq мы создали на любом из концов. Чтобы добавить элемент справа от двухсторонней очереди, вы должны использовать метод append()

Если вы хотите добавить элемент в начало appendleft() .

 deq.append("d") 
 deq.appendleft("e") 
 print(deq)deque 

Выход:

 deque(['e', 'a', 'b', 'c', 'd']) 

Вы можете заметить, что d добавляется в конце deq, а e добавляется в начало deq

Удаление элементов из двухсторонней очереди

Удаление элементов аналогично вставке элементов. Вы можете удалить элемент так же, как вставляете элементы. Чтобы удалить элемент с правого конца, вы можете использовать pop() а чтобы удалить элемент с левого popleft() .

 deq.pop() 
 deq.popleft() 
 print(deq) 

Выход:

 deque(['a', 'b', 'c']) 

Вы можете заметить, что и первый, и последний элементы удалены из deq .

Очистка двухсторонней очереди

Если вы хотите удалить все элементы из двухсторонней очереди, вы можете использовать функцию clear()

 list = ["a","b","c"] 
 deq = deque(list) 
 print(deq) 
 print(deq.clear()) 

Выход:

 deque(['a', 'b', 'c']) 
 None 

Как видно на выходе, сначала идет очередь из трех элементов. Как только мы применили clear() , двухсторонняя очередь очищается, и вы не видите none на выходе.

Подсчет элементов в двухсторонней очереди

Если вы хотите узнать количество определенного элемента, используйте функцию count(x) Вы должны указать элемент, для которого вам нужно найти счетчик, в качестве аргумента.

 list = ["a","b","c"] 
 deq = deque(list) 
 print(deq.count("a")) 

Выход:

 1 

В приведенном выше примере количество «а» равно 1. Следовательно, напечатано «1».

Цепная карта

ChainMap используется для объединения нескольких словарей или отображений. Возвращает список словарей.

Импортировать карту цепочки

Перед использованием необходимо импортировать ChainMap из collections

 from collections import ChainMap 
Создать ChainMap

Для создания карты цепи мы можем использовать конструктор ChainMap() . Мы должны передать словари, которые мы собираемся объединить, в качестве набора аргументов.

 dict1 = { 'a' : 1, 'b' : 2 } 
 dict2 = { 'c' : 3, 'b' : 4 } 
 chain_map = ChainMap(dict1, dict2) 
 print(chain_map.maps) 

Выход:

 [{'b': 2, 'a': 1}, {'c': 3, 'b': 4}] 

В качестве вывода вы можете увидеть список словарей. Вы можете получить доступ к значениям карты цепочки по имени ключа.

 print(chain_map['a']) 

Выход:

 1 

«1» печатается, поскольку значение ключа «a» равно 1. Другой важный момент - ChainMap обновляет свои значения при обновлении связанных с ней словарей. Например, если вы измените значение «c» в dict2 на «5», вы также заметите изменение в ChainMap .

 dict2['c'] = 5 
 print(chain_map.maps) 

Выход:

 [{'a': 1, 'b': 2}, {'c': 5, 'b': 4}] 
Получение ключей и значений из ChainMap

Вы можете получить доступ к клавишам ChainMap с keys() . Точно так же вы можете получить доступ к значениям элементов с помощью функции values() , как показано ниже:

 dict1 = { 'a' : 1, 'b' : 2 } 
 dict2 = { 'c' : 3, 'b' : 4 } 
 chain_map = ChainMap(dict1, dict2) 
 print (list(chain_map.keys())) 
 print (list(chain_map.values())) 

Выход:

 ['b', 'a', 'c'] 
 [2, 1, 3] 

Обратите внимание, что значение ключа 'b' в выводе является значением ключа 'b' в dict1 . Как правило, когда один ключ появляется в нескольких связанных словарях, ChainMap берет значение этого ключа из первого словаря.

Добавление нового словаря в ChainMap

Если вы хотите добавить новый словарь к существующей ChainMap , используйте new_child() . Он создает новую ChainMap с недавно добавленным словарем.

 dict3 = {'e' : 5, 'f' : 6} 
 new_chain_map = chain_map.new_child(dict3) 
 print(new_chain_map) 

Выход:

 ChainMap({'f': 6, 'e': 5}, {'a': 1, 'b': 2}, {'b': 4, 'c': 3}) 

Обратите внимание, что новый словарь добавлен в начало списка ChainMap

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

namedtuple() возвращает кортеж с именами для каждой позиции в кортеже. Одна из самых больших проблем с обычными кортежами заключается в том, что вы должны помнить индекс каждого поля объекта кортежа. Очевидно, это сложно. Для решения этой проблемы был введен namedtuple

Импортировать namedtuple

Перед использованием namedtuple необходимо импортировать его из модуля collections

 from collections import namedtuple 
Создать именованный кортеж
 from collections import namedtuple 
 
 Student = namedtuple('Student', 'fname, lname, age') 
 s1 = Student('John', 'Clarke', '13') 
 print(s1.fname) 

Выход:

 Student(fname='John', lname='Clarke', age='13') 

В этом примере namedtuple объект Student . Вы можете получить доступ к полям любого экземпляра Student по заданному имени поля.

Создание именованного кортежа с помощью списка

Функция namedtuple() требует, чтобы каждое значение передавалось ей отдельно. Вместо этого вы можете использовать _make() для создания namedtuple со списком. Проверьте следующий код:

 s2 = Student._make(['Adam','joe','18']) 
 print(s2) 

Выход:

 Student(fname='Adam', lname='joe', age='18') 
Создайте новый экземпляр, используя существующий экземпляр

_asdict() можно использовать для создания OrderedDict из существующего экземпляра.

 s2 = s1._asdict() 
 print(s2) 

Выход:

 OrderedDict([('fname', 'John'), ('lname', 'Clarke'), ('age', '13')]) 
Изменение значений полей с помощью функции _replace ()

Чтобы изменить значение поля экземпляра, используется _replace() . Помните, что _replace() создает новый экземпляр. Это не меняет значение существующего экземпляра.

 s2 = s1._replace(age='14') 
 print(s1) 
 print(s2) 

Выход:

 Student(fname='John', lname='Clarke', age='13') 
 Student(fname='John', lname='Clarke', age='14') 

Заключение

На этом мы завершаем наше руководство по модулю Коллекции. Мы обсудили все важные темы в модуле коллекции. Модуль коллекции Python все еще нуждается в улучшениях, если мы сравним его с библиотекой Java Collection. Поэтому в следующих версиях можно ожидать много изменений.

Рекомендации

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus