Baixe o app para aproveitar ainda mais
Prévia do material em texto
19/11/2020 Estácio estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D2338254ABBF19DC3C579057D5F6751F493C453DDA5EC2326A3618B0722… 1/11 Disciplina: Informática para Engenharia Aula 9: Estruturas e Tipos Abstratos de Dados Apresentação Em diversas situações do cotidiano, necessitamos lidar com um conjunto complexo de informações impossível de ser representado pelos tipos básicos de dados suportados pelos computadores. Os tipos de dados requeridos podem ser compostos por um mesmo tipo de valores (homogêneo) ou por dados distintos (heterogêneo) e ser estáticos ou dinâmicos. Podem, ainda, realizar diferentes operações sobre os dados. A uma estrutura de dados e suas operações damos o nome de tipos abstratos de dados. Objetivos Analisar as diferentes formas de representar os dados a partir do comportamento esperado pelo usuário; Avaliar o uso de técnicas para criação e manipulação de estruturas de dados abstratas. 19/11/2020 Estácio estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D2338254ABBF19DC3C579057D5F6751F493C453DDA5EC2326A3618B0722… 2/11 Estrutura de dados e algoritmos Sabemos que os algoritmos manipulam uma grande variedade de informações a partir de um conjunto sistemático de regras. Tais regras manipulam dados que representam algum fenômeno do mundo real, como os números inteiros. Comentário No entanto, em algumas situações, esse é um fator limitante para a modelagem e implementação de diversos problemas de várias áreas do conhecimento. Operações com estruturas complexas, como vetores e matrizes, são recorrentes nas áreas de exatas, como a Engenharia. O Python fornece uma variedade de estruturas de dados internas úteis, como listas (lists), conjuntos (sets) e dicionários (dictionaries). Na maior parte, o uso dessas estruturas é simples. Por meio da biblioteca NumPy <//www.numpy.org/> , é possível utilizar estruturas do tipo vetor (array) e matriz. No entanto, surgem questões comuns sobre pesquisa, classificação, ordenação e filtragem. Assim, o objetivo deste capítulo é discutir estruturas de dados comuns e algoritmos envolvendo dados. Além disso, o tratamento é dado às várias estruturas de dados contidas no módulo de coleções. Estruturas de dados heterogêneas Lists Lista é uma sequência ordenada (indexada) de itens. Trata-se de um dos tipos de dados mais usados no Python e é muito flexível. Nenhum item em uma lista precisa ser do mesmo tipo. Declarar uma lista é bastante simples. Itens separados por vírgulas são colocados entre colchetes [ ]. >>> lst = [5, 7.2, ‘python’] http://www.numpy.org/ 19/11/2020 Estácio estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D2338254ABBF19DC3C579057D5F6751F493C453DDA5EC2326A3618B0722… 3/11 Apesar da possibilidade de uso de estruturas de repetição, por exemplo o to, para percorrer itens em um vetor, podemos usar o operador colchetes [ ] para extrair um item ou um intervalo de itens de uma lista. O índice inicia a partir do 0 em Python. Por exemplo, a lista a seguir armazena a temperatura (em celsius) medida a cada 4 horas durante um dia. >>> tmp = [15.0,16.8, 20.3, 22.4, 21.8, 19.1] Para acessarmos o primeiro valor, utilizamos o comando no console. >>> print(tmp[0]) 15 Podemos também acessar valores da lista a partir de intervalos informados, utilizando os : (dois-pontos) no operador colchetes. Por exemplo, considerando que esse valor é a temperatura medida às 02h, poderíamos realizar as operações: >>> antes10h = tmp[0:3] #ou antes10h = tmp[:3] >>> print(antes10h) [15.0, 16.8, 20.3] Nesse caso, podemos suprimir o intervalo inicial – o 0 (zero) –, que surtirá o mesmo efeito. Agora, se quisermos os últimos horários, devemos digitar o seguinte comando no console: >>> depois10h=tmp[3:] >>> print(depois10h) [22.4, 21.8, 19.1] Se quisermos exibir as temperaturas de 4 em 4 horas, podemos fazê-lo com o seguinte comando: >>> tmp[0:6:2] #percorrer elementos do início ao fim de dois em dois elementos [15.0, 20.3, 21.8] Uma vez que as listas são mutáveis, você pode atualizar elementos de listas, informando a posição (índice) nos colchetes. Por exemplo, para atualizarmos a temperatura das 02 horas, digitamos o seguinte comando: >>> tmp[0]=15.2 >>> print(tmp) [15.2, 16.8, 20.3, 22.4, 21.8, 19.1] De maneira similar, você pode usar a instrução del para remover um conteúdo da lista se souber exatamente qual/quais elemento(s) você está excluindo, ou o método remove ( ) se você não souber. Por exemplo: >>> del tmp[2] >>> print(tmp) [15.2, 16.8, 22.4, 21.8, 19.1] A inserção de itens na lista pode ser realizada de duas maneiras: no final da lista ou informando a posição. O comando para inserir um elemento no fim da lista é o append( ). >>> tmp.append(15) >>> print(tmp) [15.2, 16.8, 20.3, 22.4, 21.8, 19.1, 15.0] Para inserir um valor em determinada posição (índice), a função é insert(índice, valor). >>> tmp.insert(2,20.3) >>> print(tmp) [15.2, 16.8, 20.3, 22.4, 21.8, 19.1, 15.0] 19/11/2020 Estácio estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D2338254ABBF19DC3C579057D5F6751F493C453DDA5EC2326A3618B0722… 4/11 Tuplas Similares às lists, as tuplas são objetos imutáveis, ou seja, uma vez criadas, não podemos modificá-la. Na prática, isso implica a impossibilidade de fazer atribuições a um objeto imutável. Caso seja necessário alterar o valor de um objeto imutável, devemos criar outro objeto para armazenar esse novo valor. As tuplas são usadas para proteger os dados e – geralmente mais rápidas que a lista – não podem ser alteradas dinamicamente. São definidas entre parênteses (), em que os itens são separados por vírgulas, conforme no exemplo a seguir: >>> t = (1,’python’, 2.3) >>> t (1,’python’, 2.3) Podemos usar o operador colchetes [ ] para extrair itens, mas não podemos alterar seu valor. As operações comuns às tuplas e listas são exibidas a seguir: >>> 2 in t1 #verifica se o valor 2 está na tupla True >>> t1[2] #exibe o conteúdo da posição 2 da tupla 3 >>> t1[0:4] #exibe os 4 primeiros elementos da tupla (1, 2, 3, 4) >>> len(t1) #exibe o tamanho da tupla 9 >>> min(t1) #exibe o menor valor da tupla 1 >>> max(t1) #exibe o maior valor da tupla 10 >>> t1.count(5) #exibe a quantidade de vezes que o valor 5 aparece na tupla 1 Sets | Conjuntos Os sets (ou conjuntos) são estruturas para construir e manipular coleções não ordenadas de elementos únicos. Usos comuns incluem testes de associação, remoção de duplicatas de uma sequência e computação de operações matemáticas padrão em conjuntos como interseção, união, diferença e diferença simétrica. Duas são as principais características dos conjuntos: Os elementos não são armazenados em uma ordem específica. Não contêm elementos repetidos. Diferentemente das listas, os sets não suportam indexação nem fatiamento (slicing). 19/11/2020 Estácio estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D2338254ABBF19DC3C579057D5F6751F493C453DDA5EC2326A3618B0722… 5/11 Um conjunto é criado colocando todos os itens (elementos) dentro de chaves {}, separados por vírgula ou usando a função interna set (). MÉTODO INTERNO (BUILT-IN) >>> A = {1, 2, 3, 4} >>> print(A) {1, 2, 3, 4} >>> A = {} #set vazio FUNÇÃO SET( ) >>> A = set([1, 2, 3, 4]) >>> print(A) {1, 2, 3, 4} >>> A = set() #set vazio Apesar de serem mutáveis, os sets não podem possuir itens mutáveis. Por exemplo, o seguinte conjunto s = {1,2,[3,4]} irá causar um erro, pois uma list (mutável) faz parte do conjunto. Assim como as lists, as operações de inclusão e exclusão são disponibilizadas pelos métodos: >>> A.add(9) #simples inclusão >>> A {1, 2, 3, 4, 9} >>> A.update([5,6,7,8]) #múltiplas inclusões >>> A {1, 2, 3, 4, 5, 6, 7, 8, 9} >>> A.discard(9) #excluindo elementos >>> A {1, 2, 3, 4, 5, 6, 7, 8} Uma vez que não suportam índices, os parâmetros passados nas funções add( ), update( ) e discard( ) são os próprios valores. Para verificarmos se determinado elemento pertence ao grupo, podemos utilizar o operador in.>>> 3 in A True >>> 13 in A False A verificação se determinado conjunto é um subconjunto de outros sets é realizada por meio do comando issubset(): >>> B = {1,2,3,4} >>> C = {3,4} >>> C.issubset(B) True De maneira similar, podemos checar se um conjunto é superconjunto do outro por meio do método issuperset(). >>> B.issuperset(C) True A disjunção entre dois conjuntos pode ser verificada pelo comando isdisjoint(). Considera-se que dois conjuntos são disjuntos se eles tiverem interseção nula. 19/11/2020 Estácio estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D2338254ABBF19DC3C579057D5F6751F493C453DDA5EC2326A3618B0722… 6/11 >>> D = {1,2} >>> E = {3,4} >>> D.isdisjoint(E) True Várias são as operações possíveis com sets, como as da Teoria Clássica dos Conjuntos (união, interseção e diferença). Para os códigos a seguir, considere A = {1, 2, 3, 4} e B = {3, 4, 5, 6}. União >>> print(A.union(B)) {1, 2, 3, 4, 5, 6} Interseção >>> print(A.intersection(B) {3, 4} Diferença >>> print(A.difference(B)) {1, 2} >>> print(B.difference(A)) {5, 6} Dica O uso dos sets pode ser muito útil quando quisermos identificar valores repetidos em listas! >>> F = [1, 2, 3] >>> G = [2, 4, 3] >>> print(set(F).intersection(G)) {2, 3} Note que transformamos F em um conjunto, para, aí sim, utilizar a função intersection. Estruturas de dados homogêneas Arrays Em problemas de computação aplicados à Engenharia, é muito comum o uso de vetores ou arrays. Semelhantes às listas do Python, arrays são estruturas de dados semelhantes às listas do Python, no entanto não tão flexíveis. 19/11/2020 Estácio estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D2338254ABBF19DC3C579057D5F6751F493C453DDA5EC2326A3618B0722… 7/11 Os arrays são estruturas unidimensionais, em que todos os elementos devem ser de um mesmo tipo, tipicamente numérico, como int ou float. Em contrapartida, o uso de arrays é muito mais eficiente e facilita a computação de grandes volumes de dados numéricos. Isso faz com que arrays sejam particularmente úteis em computação científica. Apesar de a biblioteca NumPy possibilitar a criação de estruturas multidimensionais, trataremos os arrays como uma estrutura de uma dimensão (rank 1). Criando Arrays Para a manipulação de arrays, temos de importar a biblioteca NumPy. >>> import numpy as np >>> a = np.array([1,2,3]) #cria um array de rank 1 >>> print(a) [1 2 3] O NymPy provê diversas funções para a criação de arrays. >>> a = np.zeros((1,10)) #Criação de um vetor de tamanho 10 com zeros. >>> print(a) [[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]] >>> b = np.ones((1,10)) #Criação de um vetor de tamanho 10 com 1’s. >>> print(b) [[ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]] >>> c = np.random.random((1,5)) #Criação de um vetor de tamanho 5 com números aleatórios >>> print(c) [[ 0.99078493, 0.52441962, 0.88399678, 0.83038698, 0.10129121]] >>> d = np.arange(10) #Criação de um vetor de tamanho 10 >>> e = np.arange(0,10,2) #Criação de um vetor com elementos de 0 até 10, com incremento de 2 unidades >>> print(e) [0 2 4 6 8] Fatiamento de arrays Assim como as listas, podemos realizar o fatiamento (slicing) de arrays da mesma maneira. >>> arr = np.arange(10) >>> arr[:5] #primeiros cinco elementos >>> arr[4:7] #meio do array >>> arr[::2] #dois em dois elementos a partir do início >>> arr[a::2] #dois em dois elementos a partir do índice 1 >>> arr[::-1] #ordem inversa Iterando arrays A maneira mais fácil de percorrer os elementos do array é pelo comando for: >>> arr = np.arange(0,20,3) >>> for elemento in arr: #Para cada elemento no arr ... print(elemento) ... No entanto, o pacote NumPy contém um iterador chamado nditer, que percorre de forma eficiente os elementos de um array. 19/11/2020 Estácio estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D2338254ABBF19DC3C579057D5F6751F493C453DDA5EC2326A3618B0722… 8/11 >>> for i in np.nditer(arr): ... print(i) ... Podemos também converter uma sequência em Python em um array. Por exemplo, a lista lst = [5,6,7,8] pode ser convertida em um array pelo comando asarray(), conforme exemplo: >>> lst=[5,6,7,8] >>> arr = np.asarray(lst) >>> print(tyep(arr)) O mesmo princípio pode ser aplicado também a tuplas. Matrizes Até o momento, consideramos a construção unidimensional, ou seja, os arrays. No entanto, o modo de construção de matrizes é o mesmo dos arrays, tendo como única diferença a inclusão de mais dimensões, a qual chamaremos de matriz estruturas com duas ou mais dimensões. Criando uma matriz >>> m = np.array([[1, 2, 3], [4, 5, 6]]) #criando uma matriz de dimensão 2 x 3 >>> print(m.ndim) #exibindo o número de dimensões da matriz 2 >>> print(m.shape) #exibindo a dimensão da matriz (linha,coluna) (2,3) >>> m1 = np.arange(6).reshape(2,3) #criando um array de tamanho e depois reajustando # para uma matriz 2x3 >>> print(m1) >>> m2 = np.ones([2,2]) #criando matriz 2x2 de 1’s >>> print(m2) >>> m3 = np.random.random((2,2)) #criando uma matriz com valores aleatórios >>> print(m3) Iterando matrizes Assim como os arrays, podemos utilizar a função nditer(), que exibirá os números da matriz seguindo uma ordem (da esquerda para a direita, de cima para baixo). >>> m = np.arange(6).reshape(2,3) >>> print(m) #exibindo a matriz original [[0 1 2] [3 4 5]] >>> for i in np.nditer(m): #exibindo os elementos por linha da esquerda para a # direita ... print(i) 0 1 2 3 4 5 Além da forma-padrão de iteração (C-order), podemos controlar sua ordem para percorrer os elementos por coluna, ou F-order. >>> for i in np.nditer(m, order=’F’): #exibindo os elementos por coluna de cima para # baixo ... print(i) 0 3 1 4 2 5 Nas Engenharias, diversas disciplinas utilizam, direta ou indiretamente, conhecimentos da área de Álgebra Linear. 19/11/2020 Estácio estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D2338254ABBF19DC3C579057D5F6751F493C453DDA5EC2326A3618B0722… 9/11 Conceitos como matriz-identidade e matriz transposta, até operações aritméticas evolvendo matrizes são largamente utilizados em computação matemática. (Fonte: Kaboompics / Efunda) Obter uma matriz transposta (aT) no Python é muito simples. Basta inserir o .T (de transposta) logo após o nome da matriz, conforme código a seguir: >>> a = np.arange(6).reshape(2,3) #cria uma matriz 2x3 >>> print(a) [[0 1 2] [3 4 5]] >>> print(a.T) #exibe a transporta da matriz a [[0 3] [1 4] [2 5]] De maneira simples, uma matriz-identidade pode ser definida simplesmente pela função eye(ordem): >>> m4 = np.eye(2) #criando uma matriz-identidade 2x2 >>> print(m4) [[ 1. 0.] [ 0. 1.]] As operações com matrizes são realizadas de maneira muito intuitiva em Python. >>> b = np.arange(6,0,-1).reshape(2,3) # cria uma matriz, cujo valor inicial é 6 # decrementando de 1 até 0 (valor final) >>> print(b) [[6 5 4] [3 2 1]] >>> c=a+b #Soma de matrizes >>> print(c) [[7 7 7] [4 4 4]] >>> d=5*b #multiplicação por um escalar >>> print(d) [[30 25 20] [15 10 5]] >>> f=a*b #multiplicação de matrizes >>> print(f) [[ 6 10 12] [3 4 3]] 19/11/2020 Estácio estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D2338254ABBF19DC3C579057D5F6751F493C453DDA5EC2326A3618B072… 10/11 Atividade 1. Quais estruturas de dados têm por características a heterogeneidade e a indexação? I. Lists II. Tuplas III. Sets IV. Arrays (vetores ou matrizes) São corretas: a) I e II. b) II e III. c) I e III. d) I, II e IV. e) II e IV. 2. Observe o trecho de código a seguir e a saída produzida: >>> dataScientist = {'Python', 'R', 'SQL', 'Git', 'Tableau', 'SAS'} >>> >>> for skill in dataScientist: ... print(skill) ... SAS Tableau Git Python R SQL Por qual motivo a saída produzida pelo código não é igual à estrutura de dados dataScientist? 3. Suponha que você foi contratado para um projeto em que tenha de realizar um estudo sobre filas. Em determinado momento, você tem de capturar o tempo entre duas chegadas consecutivas (Tempoentre chegadas) de 30 pessoas em uma fila de atendimento. Considere o menor tempo de 1 segundo e o maior de 5 segundos. Desenvolva uma solução em Python para exibir o tempo médio de espera, o menor e o maior tempo. DICA: pesquise pelo np.random.randint() 19/11/2020 Estácio estacio.webaula.com.br/Classroom/index.asp?191C757E76=484D2338254ABBF19DC3C579057D5F6751F493C453DDA5EC2326A3618B072… 11/11 Referências GRUS, J. Data Science from Scratch: first principles with Python. Beijing: O’Reilly, 2015. MUELLER, J.P. Começando a programar em Python para Leigos. Rio de Janeiro: Alta Books, 2016. PERKOVIC, L. Introduction to Computing using Python: an application development focus. 2. ed. [s.l.] Wiley Publishing, 2015. WESTRA, E. Modular Programming with Python. Birmingham: Packt, 2016. Próximos Passos Estruturas de dados avançadas, nova operações e relacionamentos, discutindo sua aplicabilidade na área das Engenharias; Exemplos didáticos de técnicas comumente utilizados para manipular de forma eficiente tais estruturas. Explore mais Assista aos vídeos: Parte 47 - Listas e Tuplas no Python 3 <https://www.youtube.com/watch?v=X7HtfqDHTD8> Curso Python 300 - Aula 16 - Conjuntos (Sets) <https://www.youtube.com/watch? v=NopnKUsBqXw> Numpy arrays #5: Operações matemáticas com Numpy arrays <https://www.youtube.com/watch?v=e6swHzsBqew> https://www.youtube.com/watch?v=X7HtfqDHTD8 https://www.youtube.com/watch?v=NopnKUsBqXw https://www.youtube.com/watch?v=e6swHzsBqew
Compartilhar