Buscar

Informática para Engenharia - Aula 9

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

Continue navegando