Estruturas de Dados em Python – Guia Completo
Publicados: 2021-06-14Índice
O que é Estrutura de Dados?
A estrutura de dados refere-se ao armazenamento computacional de dados para uso eficiente. Ele armazena os dados de uma maneira que pode ser facilmente modificada e acessada. Ele se refere coletivamente aos valores dos dados, relação entre eles e as operações que podem ser realizadas nos dados. A importância da estrutura de dados está em sua aplicação para o desenvolvimento de programas de computador. Como os programas de computador dependem muito de dados, o arranjo adequado dos dados para facilitar o acesso é de suma importância para qualquer programa ou software.
As quatro principais funções de uma estrutura de dados são:
- Para inserir informações
- Para processar as informações
- Para manter as informações
- Para recuperar as informações
Tipos de estruturas de dados em Python
Várias estruturas de dados são suportadas pelo Python para fácil acesso e armazenamento de dados. Os tipos de estruturas de dados Python podem ser classificados como tipos de dados primitivos e não primitivos. Os primeiros tipos de dados incluem Integers, Float, Strings e Boolean, enquanto o último é a matriz, lista, tuplas, dicionários, conjuntos e arquivos. Portanto, as estruturas de dados em python são estruturas de dados internas e estruturas de dados definidas pelo usuário. A estrutura de dados interna é chamada de estrutura de dados não primitiva.
Estruturas de dados incorporadas
Python possui várias estruturas de dados que atuam como contêineres para armazenamento de outros dados. Essas estruturas de dados python são List, Dictionaries, Tuple e Sets.
Estruturas de dados definidas pelo usuário
Essas estruturas de dados podem ser programadas com a mesma função que as estruturas de dados internas em python . As estruturas de dados definidas pelo usuário são: Linked List, Stack, Queue, Tree, Graph e Hashmap.
Lista de estruturas de dados incorporadas e explicação
1. Lista
Os dados armazenados em uma lista são organizados sequencialmente e de diferentes tipos de dados. Para cada dado, um endereço é atribuído e é conhecido como índice. O valor do índice começa com 0 e continua até o último elemento. Isso é chamado de índice positivo. Um índice negativo também existe se os elementos forem acessados inversamente. Isso é chamado de indexação negativa.
Criação de lista
A lista é criada como colchetes. Os elementos podem então ser adicionados de acordo. Ele pode ser adicionado entre colchetes para criar uma lista. Se nenhum elemento for adicionado, uma lista vazia será criada. Caso contrário, os elementos da lista serão criados.
Entrada my_list = [] #criar lista vazia print(minha_lista) my_list = [1, 2, 3, 'example', 3.132] #criando lista com dados print(minha_lista) | Saída [] [1, 2, 3, 'exemplo', 3.132] |
Adicionando elementos em uma lista
Três funções são usadas para a adição de elementos dentro de uma lista. Essas funções são append(), extend() e insert().
- Todos os elementos são adicionados como um único elemento usando a função append().
- Para adicionar elementos um a um na lista, a função extend() é usada.
- Para adicionar elementos por seu valor de índice, a função insert() é usada.
Entrada minha_lista = [1, 2, 3] print(minha_lista) my_list.append([555, 12]) #add como um único elemento print(minha_lista) my_list.extend([234, 'more_example']) #add como elementos diferentes print(minha_lista) my_list.insert(1, 'insert_example') #add elemento i print(minha_lista) | Saída: [1, 2, 3] [1, 2, 3, [555, 12]] [1, 2, 3, [555, 12], 234, 'mais_exemplo'] [1, 'inserir_exemplo', 2, 3, [555, 12], 234, 'mais_exemplo'] |
Exclusão de elementos em uma lista
Uma palavra-chave interna “del” em python é usada para excluir um elemento da lista. No entanto, esta função não retorna o elemento excluído.
- Para retornar um elemento excluído, a função pop() é usada. Ele usa o valor de índice do elemento a ser excluído.
- A função remove() é usada para deletar um elemento pelo seu valor.
Saída:
[1, 2, 3, 'exemplo', 3.132, 30]
[1, 2, 3, 3.132, 30]
Elemento estourado: 2 Lista restante: [1, 3, 3.132, 30]
[]
Avaliação de elementos em uma lista
- Avaliar o elemento em uma lista é simples. A impressão da lista exibirá diretamente os elementos.
- Elementos específicos podem ser avaliados passando o valor do índice.
Saída:
1
2
3
exemplo
3.132
10
30
[1, 2, 3, 'exemplo', 3.132, 10, 30]
Exemplo
[1, 2]
[30, 10, 3.132, 'exemplo', 3, 2, 1]
Além das operações mencionadas acima, várias outras funções embutidas estão disponíveis em python para trabalhar com listas.
- len(): a função é usada para retornar o comprimento da lista.
- index(): esta função permite ao usuário saber o valor do índice de um valor passado.
- A função count() é usada para encontrar a contagem do valor passado para ela.
- sort() classifica o valor em uma lista e modifica a lista.
- sorted() classifica o valor em uma lista e retorna a lista.
Saída
6
3
2
[1, 2, 3, 10, 10, 30]
[30, 10, 10, 3, 2, 1]
2. Dicionário
Dicionário é um tipo de estrutura de dados em que os pares de valores-chave são armazenados em vez de elementos únicos. Isso pode ser explicado com o exemplo de uma lista telefônica que tem todos os números de indivíduos junto com seus números de telefone. O nome e o número de telefone aqui definem os valores constantes que são a “chave” e os números e nomes de todos os indivíduos como os valores dessa chave. A avaliação de uma chave dará acesso a todos os valores armazenados nessa chave. Essa estrutura de valor-chave definida no Python é conhecida como dicionário.
Criação de um dicionário
- As chaves de flores ociosas da função dict() podem ser usadas para criar um dicionário.
- Os pares chave-valor devem ser adicionados durante a criação de um dicionário.
Modificação em pares de valores-chave
Qualquer modificação no dicionário pode ser feita apenas através da chave. Portanto, as chaves devem ser acessadas primeiro e depois as modificações devem ser realizadas.
Entrada my_dict = {'First': 'Python', 'Second': 'Java'} print(my_dict) my_dict['Second'] = 'C++' #change element print(my_dict) my_dict['Third'] = 'Ruby' #adicionando impressão do par chave-valor (my_dict) | Saída: {'Primeiro': 'Python', 'Segundo': 'Java'} {'Primeiro': 'Python', 'Segundo': 'C++'} {'Primeiro': 'Python', 'Segundo': 'C++', 'Terceiro': 'Ruby'} |
Exclusão de um dicionário
Uma função clear() é usada para excluir todo o dicionário. O dicionário pode ser avaliado através das chaves usando a função get() ou passando os valores das chaves.
Entrada dict = {'Mês': 'Janeiro', 'Temporada': 'inverno'} print(dict['Primeiro']) print(dict.get('Segundo') | Saída Janeiro Inverno |
Outras funções associadas a um dicionário são keys(), values() e items().
3. Tupla
Semelhante à lista, Tuplas são listas de armazenamento de dados, mas a única diferença é que os dados armazenados em uma tupla não podem ser modificados. Se os dados dentro de uma tupla forem mutáveis, somente então será possível alterar os dados.
- Tuplas podem ser criadas através da função tuple().
Entrada
new_tuple = (10, 20, 30, 40)
print(new_tuple)
Saída
(10, 20, 30, 40)
- Os elementos em uma tupla podem ser avaliados da mesma maneira que os elementos em uma lista.
Entrada
new_tuple2 = (10, 20, 30, 'idade')
para x em new_tuple2:
imprimir(x)
print(new_tuple2)
print(new_tuple2[0])
Saída
10
20
30
Idade
(10, 20, 30, 'idade')
10
- O operador '+' é usado para anexar outra tupla
Entrada
tupla = (1, 2, 3)
tupla = tupla + (4, 5, 6
imprimir(tupla)
Saída
(1, 2, 3, 4, 5, 6)
4. Definir
A estrutura de dados do conjunto é semelhante aos conjuntos aritméticos. É basicamente a coleção de elementos únicos. Se os dados continuarem se repetindo, os conjuntos consideram adicionar esse elemento apenas uma vez.
- Um conjunto pode ser criado apenas passando os valores para ele entre chaves de flores.
Entrada
conjunto = {10, 20, 30, 40, 40, 40}
imprimir(conjunto)
Saída
{10, 20, 30, 40}
- A função add() pode ser usada para adicionar elementos a um conjunto.
- Para combinar dados de dois conjuntos, a função union() pode ser usada.
- Para identificar os dados que estão presentes em ambos os conjuntos, é utilizada a função de interseção().
- A função Difference() gera apenas os dados exclusivos do conjunto, removendo os dados comuns.
- A função symmetric_difference() gera os dados exclusivos para ambos os conjuntos.
Lista de estruturas de dados definidas pelo usuário e explicação
1. Pilhas
Uma pilha é uma estrutura linear que é uma estrutura Last in First out (LIFO) ou First in Last Out (FIFO). Existem duas operações principais na pilha, ou seja, push e pop. Push significa anexar um elemento no topo da lista, enquanto pop significa remover um elemento da parte inferior da pilha. O processo está bem descrito na Figura 1.
Utilidade da pilha
- Elementos anteriores podem ser avaliados por meio de rastreamento para trás.
- Correspondência de elementos recursivos.
Fonte
Figura 1: Representação gráfica do Stack
Exemplo
Saída
['primeiro segundo terceiro']
['primeiro segundo terceiro quarto quinto']
quinto
['primeiro segundo terceiro quarto']
2. Fila
Semelhante às pilhas, uma fila é uma estrutura linear que permite a inserção de um elemento em uma extremidade e a exclusão na outra extremidade. As duas operações são conhecidas como enfileirar e desenfileirar. O elemento adicionado recentemente é removido primeiro como as pilhas. Uma representação gráfica da fila é mostrada na Figura 2. Um dos principais usos de uma fila é para o processamento de coisas assim que elas entram.
Fonte
Figura 2 : Representação gráfica de filas
Exemplo
Saída
['primeiro segundo terceiro']
['primeiro segundo terceiro quarto quinto']
primeiro
quinto
['segundo', 'terceiro', 'quarto', 'quinto']
3. Árvore
As árvores são estruturas de dados não lineares e hierárquicas que consistem em nós ligados através de arestas. A estrutura de dados da árvore python tem um nó raiz, um nó pai e um nó filho. A raiz é o elemento mais alto de uma estrutura de dados. Uma árvore binária é uma estrutura na qual os elementos não têm mais do que dois nós filhos.
A utilidade de uma árvore
- Exibe os relacionamentos estruturais dos elementos de dados.
- Atravessar cada nó com eficiência
- Os usuários podem inserir, pesquisar, recuperar e excluir os dados.
- Estruturas de dados flexíveis
Figura 3: Representação gráfica de uma árvore
Fonte
Exemplo:
Saída
Primeiro
Segundo
Terceiro
4. Gráfico
Outra estrutura de dados não linear em python é o gráfico que consiste em nós e arestas. Graficamente ele exibe um conjunto de objetos, com alguns objetos conectados por meio de links. Os vértices são objetos interconectados enquanto os links são chamados de arestas. A representação de um grafo pode ser feita através da estrutura de dados do dicionário python, onde a chave representa os vértices e os valores representam as arestas.
Operações básicas que podem ser executadas em gráficos
- Exibir vértices e arestas do gráfico.
- Adição de um vértice.
- Adição de uma aresta.
- Criação de um gráfico
A utilidade de um gráfico
- A representação de um gráfico é fácil de entender e seguir.
- É uma ótima estrutura para representar relacionamentos vinculados, ou seja, amigos do Facebook.
Figura 4: Representação gráfica de um gráfico
Fonte
Exemplo
g = gráfico(4)
g.borda(0, 2)
g.borda(1, 3)
g.borda(3, 2)
g.borda(0, 3)
g.__repr__()
Saída
Lista de adjacências do vértice 0
cabeça -> 3 -> 2
Lista de adjacências do vértice 1
cabeça -> 3
Lista de adjacências do vértice 2
cabeça -> 3 -> 0
Lista de adjacências do vértice 3
cabeça -> 0 -> 2 -> 1
5. Mapa de hash
Hashmaps são estruturas de dados python indexadas úteis para o armazenamento de pares chave-valor. Os dados armazenados em hashmaps são recuperados através das chaves que são computadas com a ajuda de uma função hash. Esses tipos de estruturas de dados são úteis para o armazenamento de dados de alunos, detalhes de clientes, etc. Dicionários em python são um exemplo de hashmaps.
Exemplo
Saída
0 -> primeiro
1 -> segundo
2 -> terceiro
0 -> primeiro
1 -> segundo
2 -> terceiro
3 -> quarto
0 -> primeiro
1 -> segundo
2 -> terceiro
Utilidade
- É o método mais flexível e confiável de recuperar informações do que outras estruturas de dados.
6. Lista vinculada
É um tipo de estrutura de dados linear. Basicamente, é uma série de elementos de dados unidos por meio de links em python. Os elementos em uma lista vinculada são conectados por meio de ponteiros. O primeiro nó dessa estrutura de dados é chamado de cabeçalho e o último nó é chamado de cauda. Portanto, uma lista encadeada consiste em nós com valores e cada nó consiste em um ponteiro vinculado a outro nó.
A utilidade das listas vinculadas
- Comparado a um array que é fixo, uma lista encadeada é uma forma dinâmica de entrada de dados. A memória é salva à medida que aloca a memória dos nós. Enquanto estiver em uma matriz, o tamanho deve ser predefinido, levando ao desperdício de memória.
- Uma lista vinculada pode ser armazenada em qualquer lugar da memória. Um nó de lista vinculada pode ser atualizado e movido para um local diferente.
Figura 6: Representação gráfica de uma lista vinculada
Fonte
Exemplo
Saída:
['primeiro segundo terceiro']
['primeiro', 'segundo', 'terceiro', 'sexto', 'quarto', 'quinto']
['primeiro', 'terceiro', 'sexto', 'quarto', 'quinto']
Conclusão
Os vários tipos de estruturas de dados em python foram explorados. Seja um novato ou um especialista, as estruturas de dados e os algoritmos não podem ser ignorados. Ao executar qualquer forma de operação nos dados, os conceitos de estruturas de dados desempenham um papel vital. As estruturas de dados auxiliam no armazenamento das informações de forma organizada, enquanto os algoritmos auxiliam na orientação ao longo da análise dos dados. Portanto, tanto as estruturas de dados quanto os algoritmos do Python auxiliam o cientista da computação ou qualquer usuário a processar seus dados.
Se você está curioso para aprender sobre estruturas de dados, confira o Programa PG Executivo em Ciência de Dados do IIIT-B & upGrad, que é 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.
Qual estrutura de dados é mais rápida em Python?
Nos dicionários, as pesquisas são mais rápidas porque o Python usa tabelas de hash para implementá-las. Se usarmos os conceitos de Big O para ilustrar a distinção, os dicionários possuem complexidade de tempo constante, O(1), enquanto as listas possuem complexidade de tempo linear, O(n).
Em Python, os dicionários são a maneira mais rápida de pesquisar dados com milhares de entradas com frequência. Os dicionários são altamente otimizados porque são o tipo de mapeamento integrado no Python. Em dicionários e listas, no entanto, há uma troca comum de espaço-tempo. Isso indica que, embora possamos reduzir o tempo necessário para nossa abordagem, precisaremos usar mais espaço de memória.
Nas listas, para conseguir o que deseja, você deve percorrer a lista completa. Um dicionário, por outro lado, retornará o valor que você está procurando sem examinar todas as chaves.
Qual é mais rápido na lista ou matriz do Python?
Em geral, as listas do Python são incrivelmente flexíveis e podem conter dados totalmente heterogêneos e aleatórios, além de serem anexadas rapidamente e em tempo constante aproximado. Eles são o caminho a percorrer se você precisar reduzir e estender sua lista de forma rápida e indolor. No entanto, eles ocupam muito mais espaço do que os arrays, em parte porque cada item da lista exige a criação de um objeto Python separado.
Por outro lado, o tipo array.array é essencialmente um wrapper fino em torno de arrays C. Ele só pode transportar dados homogêneos (ou seja, dados do mesmo tipo), portanto, a memória é limitada a sizeof(one object) * comprimento bytes.
Qual é a diferença entre matriz NumPy e lista?
Numpy é o pacote principal de computação científica do Python. Ele usa um grande objeto de matriz multidimensional, bem como utilitários para manipulá-los. Um array numpy é uma grade de valores de tipo idênticos indexados por uma tupla de inteiros não negativos.
As listas foram incluídas na biblioteca principal do Python. Uma lista é semelhante a um array em Python, mas pode ser redimensionada e conter elementos de vários tipos. Qual é a verdadeira diferença aqui? Desempenho é a resposta. As estruturas de dados Numpy são mais eficientes em termos de tamanho, desempenho e funcionalidade.