Módulo de coleções Python: Counter, ChainMap, Deque e Tuple
Publicados: 2020-12-01O módulo Python Collections oferece um conjunto de tipos de dados de contêiner que estendem os recursos de contêineres de estoque, como Listas, Tuplas, Conjuntos e Dicionários. Com esses contêineres especiais, você não apenas tem os recursos dos contêineres de estoque, mas também alguns métodos extras que são muito úteis para determinadas tarefas.
Ao final deste tutorial, você terá o conhecimento do seguinte:
- O que é o módulo de coleções?
- Diversas funções como:
- Contador
- ChainMap
- Deque
- Tupla Nomeada
- Exemplos de trabalho
O módulo Collections vem pré-instalado em Python, então não precisamos instalá-lo. Podemos apenas importá-lo e você está pronto para ir! Vamos entrar em detalhes sobre as funções mais usadas.
Aprenda a aprender ciência de dados das melhores universidades do mundo. Ganhe Programas PG Executivos, Programas de Certificado Avançado ou Programas de Mestrado para acelerar sua carreira.
Deve ler: aplicativos Python fascinantes no mundo real
Índice
Contador
O Contador é facilmente a função mais utilizada e útil do módulo Coleções. Counter é uma subclasse da classe de dicionário em Python. Ele conta o número de ocorrências de cada elemento em um iterável (como strings, tuplas, listas, etc.) e o armazena em um dicionário. As chaves do dicionário são os elementos únicos no iterável e os valores são as contagens desses elementos.
Vamos experimentá-lo com alguns exemplos.
Importar coleções Marvel = 'Bad Wolverine intimidado pobre Homem de Ferro Bad Wolverine pobre pobre Homem de Ferro' Marvel_count = collections.Counter(Marvel.split()) |
#Saída: Counter({ 'Ruim' : 3 , 'Ferro' : 2 , 'Homem' : 2 , 'Pobre' : 2 , 'Wolverine' : 2 , 'intimidado' : 1 }) |
Como vemos, ele contava as ocorrências de cada elemento e as colocava em um dicionário. Isso pode ser usado em qualquer tipo de iterável. Agora vamos ver quais são todos os métodos que ele tem.
Marvel_count[ 'Ruim' ] #>> 3 Marvel_count.values() #>> dict_values([3, 2, 1, 2, 2, 2]) Marvel_count.keys() #>> dict_keys(['Bad', 'Wolverine', 'bullied', 'Iron', 'Man', 'Pobre']) |
O método most_common(n) retorna uma lista dos n elementos mais comuns organizados em ordem decrescente de contagem.
Marvel_count.most_common( 2 ) #>> [('Ruim', 3), ('Wolverine', 2)] |
ChainMap
ChainMap é usado para fazer uma única visualização de muitos dicionários para que eles possam ser acessados e atualizados a partir de uma única visualização, ou seja, do próprio objeto ChainMap. Tenha em mente que esses ChainMaps consistem apenas nas referências aos dicionários reais e a atualização também é feita nos próprios dicionários reais.
ChainMap é uma extensão da classe de dicionário, então todos os métodos de dicionário são suportados, além de alguns métodos extras que veremos.
dic1 = { 'a' : 1 , 'b' : 2 } dic2 = { 'b' : 3 , 'c' : 4 } Dic3 = { 'b' : 9 , 'd' : 4 } chain1 = coleções.ChainMap(dic2, dic1) cadeia1 |
No código acima, definimos dois dicionários dic1 e dic2 e os colocamos em um objeto ChainMap.
#Saída: ChainMap({ 'b' : 3 , 'c' : 4 }, { 'a' : 1 , 'b' : 2 }) |
Como vemos, dic2 está 'encadeado' com dic1 nesta mesma ordem. Em essência, você pode imaginar dic2 sendo conectado a dic1 como dic2–>dic1. Então, quando procuramos a chave 'b', ela primeiro pesquisará no primeiro mapeamento que é dic2 e se a chave não for encontrada, ela irá para os próximos mapeamentos.
Portanto, a ordem do ChainMap é importante para determinar qual mapeamento é pesquisado primeiro. Vamos ver isso em ação.
cadeia1[ 'b' ] #>> 3 |
Como vemos que acima ChainMap tem a chave 'b' em ambos os dicionários. Então quando procuramos pela chave 'b', ela procura no primeiro mapeamento que é dic2 e retorna o valor.
atributo de mapas
O atributo de mapas ChainMap retorna uma lista de mapeamentos na ordem de busca, ou seja, dic2 é o primeiro no mapa, então ele será pesquisado primeiro e assim por diante.
chain1.maps #>> [{'b': 3, 'c': 4}, {'a': 1, 'b': 2}] |
Da mesma forma, podemos verificar chaves e valores:
lista(cadeia1.chaves()) #>> ['a', 'c', 'b'] |
lista(cadeia1.valores()) #>> [1, 4, 3] |
Como vemos, apenas as chaves exclusivas são mostradas e os valores também.
new_child(m=Nenhum)
O método new_child() é usado para adicionar novos mapas no ChainMap. Este método retorna um novo ChainMap com o novo mapa como o primeiro mapa seguido pelo resto dos mapas. Se m for especificado, ele se tornará o primeiro mapa, caso contrário, um dicionário vazio será adicionado como o primeiro mapa.
chain1.new_child(dic3) chain1.maps |
#Saída: [{ 'b' : 9 , 'd' : 4 }, { 'b' : 3 , 'c' : 4 }, { 'a' : 1 , 'b' : 2 }] |
Como vemos, ele adicionou o dic3 no início e retornou um novo objeto ChainMap.
invertido
Você pode estar se perguntando como você pode alterar a ordem do ChainMap. Isso pode ser feito usando a função reversed que retorna um iterador para iterar pelo ChainMap na direção reversa. Vamos ver isso em ação.
A chave 'b' está agora em todos os mapas. O primeiro mapa no ChainMap tem a chave 'b' com valor 9.
cadeia1[ 'b' ] #>> 9 |
Vamos ver o que acontece quando iteramos na direção inversa.
chain1.maps = reversed(chain1.maps) cadeia1[ 'b' ] #>> 2 |
Lembre-se de que a função reversed não reverte realmente o mapeamento, apenas fornece um iterador invertido.
Leia: Tutorial Python
Deque
Deque (pronunciado como 'deck' ) é uma extensão de listas, mas dupla. Deque significa: Double Ended Queue porque podemos remover/deslocar e anexar elementos em qualquer extremidade de Deques de forma eficiente, ao contrário de listas onde todas as operações estão no lado direito.

deque(iterable, maxlen) recebe iteráveis e retorna objetos deque. Eles também têm um parâmetro maxlen que decide o limite superior do número de elementos. Se não for especificado, o deque pode crescer indefinidamente. Vamos dar uma olhada em seus métodos rápidos.
deq = coleções.deque([ 1 , 2 , 3 , 4 , 5 ], maxlen= 6 ) deq.appendleft( 8 ) |
#Saída: deque([ 8 , 1 , 2 , 3 , 4 , 5 ]) |
Como vemos, chamar o método appendleft anexou o elemento na extremidade esquerda. Além disso, como inicializamos com maxlen como 6, que chegou agora, anexar outro elemento lançará “StopIterationError”.
Então, vamos remover o elemento mais à esquerda usando popleft :
deq.popleft() #>> 8 |
Também podemos remover um elemento específico por valor usando remove:
deq.remove( 5 ) #>> deque([1, 2, 3, 4]) |
Nota: chamar o método remove com um elemento que não está no deque lançará um “ValueError”.
Podemos inserir qualquer elemento no índice especificado usando insert(index, element) .
deq.inserir( 2 , 7 ) #>> deque([1, 2, 7, 3, 4]) |
Deque pode ser revertido chamando o método reverse .
deq.reverse() #>> deque([4, 3, 7, 2, 1]) |
Deque também pode ser girado no sentido horário ou anti-horário usando o método de rotação .
#Sentido horáriodeq.girar( 2 )#>> deque([2, 1, 4, 3, 7]) |
#Anti-horáriodeq.girar( -2 )#>> deque([4, 3, 7, 2, 1]) |
Tupla Nomeada
namedtuple() é uma grande melhoria do objeto tuple usual em Python. Tuplas nomeadas nos permitem indexar elementos por seus nomes em vez de apenas posições. Você pode pensar em tuplas nomeadas como tabelas com o nome da tabela como o nome da tupla e os nomes das colunas como os nomes do índice. Named Tuple essencialmente atribui significado a cada elemento para acesso mais fácil e código mais legível.
Vamos pegar alguns exemplos e entender como funciona.
Desempenho = collections.namedtuple( 'Employee_Rating' , [ 'Q1' , 'Q2' , 'Q3' , 'Q4' ]) |
No código acima, definimos um objeto Tupla Nomeada “Performance” de nome “Employee_Rating” com nomes de campo como “Q1”, “Q2”, “Q3” e “Q4” que armazenará as classificações trimestrais dos Funcionários. Vamos fazer 2 entradas de tupla nomeadas de Employee_Rating.
rahul = Desempenho( 3 , 4 , 3,5 , 4,5 ) ankit = Desempenho( 4 , 4.5 , 4 , 4.5 ) |
#Saída: Employee_Rating(Q1= 4 , Q2= 4,5 , Q3= 4 , Q4= 4,5 ) Employee_Rating(Q1= 3 , Q2= 4 , Q3= 3,5 , Q4= 4,5 ) |
Agora que criamos 2 entradas, podemos acessá-las por nomes de índice.
ankit.Q1 #>> 4 |
ankit.Q3 > rahul.Q3 #>> Verdadeiro |
Para adicionar novas entradas ou criar novos objetos de tupla nomeados, podemos usar o método _make() .
Milkha = Performance._make([ 4 , 5 , 5 , 4.5 ]) Milkha |
#Saída: Employee_Rating(Q1= 4 , Q2= 5 , Q3= 5 , Q4= 4,5 ) |
Podemos editar os elementos usando o método _replace em qualquer tupla nomeada.
rahul._replace(Q1= 2 ) |
#Saída: Employee_Rating(Q1= 2 , Q2= 4 , Q3= 3,5 , Q4= 4,5 ) |
Antes de você ir
O módulo Collections tem mais algumas funções úteis, como OrderedDict, defaultdict, UserList, UserString, UserDict. Certifique-se de obter algumas mãos sobre as funções que discutimos neste tutorial. Esses tipos de contêiner não apenas facilitam sua vida, mas também melhoram a qualidade do código que você escreve.
Se você está curioso para aprender sobre python, ciência de dados, confira o Programa PG Executivo em Ciência de Dados do IIIT-B & upGrad, criado para profissionais que trabalham e oferece mais de 10 estudos de caso e projetos, workshops práticos práticos, orientação com especialistas do setor , 1-on-1 com mentores do setor, mais de 400 horas de aprendizado e assistência de trabalho com as principais empresas.
O que é um módulo de coleta e como ele é útil?
O módulo de coleção do Python suporta vários tipos de contêineres. Um Container é um objeto usado para armazenar vários itens e fornecer os meios para recuperar e iterar sobre os objetos incluídos. Tupla, Lista, Dicionário e mais contêineres internos estão disponíveis. Além disso, o módulo Collections possui tipos de dados de contêiner altamente especializados e eficientes, como namedtuple(), deque, OrderedDict, counter e assim por diante, que são muito superiores aos contêineres padrão do Python.
O módulo de coleção é um tópico necessário para Python?
Sim, o módulo de coleção é um tópico necessário ao aprender Python. Contar objetos, construir filas e pilhas, gerenciar chaves ausentes em dicionários e muito mais são possíveis com o módulo de coleções do Python. Os tipos e classes de dados das coleções são criados para serem eficientes e Pythonic. Eles são muito valiosos para sua carreira de programação Python, portanto, dedicar um tempo para aprender sobre este módulo de coleção vale a pena seu tempo e esforço. Os contêineres no módulo Collections podem ser bastante benéficos para projetos e modelos de nível de negócios, aumentando significativamente a utilidade de contêineres Python genéricos por meio de otimização e velocidade de execução aprimoradas.
Quais são os tipos de dados presentes no Módulo de coleta?
Vários tipos de dados estão presentes no módulo de coleta, como deque, defaultdict, namedtuple, OrderedDict, Counter, ChainMap, UserDict, UserList, UserString, etc. final da sequência, construindo valores padrão para chaves ausentes e adicionando-as automaticamente ao dicionário. Esses tipos de dados também podem ajudar fornecendo campos nomeados que permitem acessar itens por nome, mantendo a capacidade de acessar itens por índice, contando itens exclusivos em uma sequência ou iterável e tratando vários mapeamentos como um único objeto de dicionário etc.