Prévia do material em texto
Python 3.x
Tipos de Dados
Tuplas
Dicionários
Introdução à Ciência da Computação
Prof. Edison Ishikawa
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Sumário
• Tuplas
• Uso
• Imutabilidade
• Sintaxe
• Fatiamento
• Atribuição
• Empacotando
• Desempacotando
• Valor de retorno
• Composição de
Estrutura de Dados
• Dicionários
• O que é
• Hashing
• Operações
• Métodos
• Apelidos e cópia
• Dicas
• Matrizes esparsas
• Inteiros longos
• Contando letras
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Tuplas
• Estrutura de Dados
• Mecanismo para agrupar e organizar dados facilitando o
seu uso
• Generalizando, uma tupla pode ser usada para agrupar
qualquer número de itens em um único valor composto
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo: o par nome/ano é um exemplo de tupla
ano_nascimento = (“Darcy Ribeiro”, 1922)
Exemplo
data_nascimento = (“Darcy Ribeiro”, 26, 10, 1922)
Imutabilidade e tuplas
• Revisão: listas são mutáveis, strings não!
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo lista
>>> lista = ["a", "b", "c", "d"]
>>> type(lista)
<class 'list'>
>>> lista[3]="X"
>>> lista
['a', 'b', 'c', 'X']
Exemplo string
>>> palavra="string"
>>> type(palavra)
<class 'str'>
>>> palavra[4]
'n'
>>> palavra[4]="X"
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
palavra[4]="X"
TypeError: 'str' object does not support item assignment
Imutabilidade e tuplas
• Tuplas são similares a listas, porém imutáveis.
• Sintaticamente, uma tupla é uma coleção de valores
separados por vírgulas.
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> t1 = "a", "b", "c", "d"
>>> type(t1)
<class 'tuple'>
>>> t1
('a', 'b', 'c', 'd')
>>> t1[2]
'c'
>>> t1[2]="Y"
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
t1[2]="Y"
TypeError: 'tuple' object does not support item assignment
Tuplas - sintaxe
• Note que o uso dos parênteses é opcional!
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo 1
>>> tupla1 = 'a', 'b', 'c', 'd'
>>> type(tupla1)
<class 'tuple'>
>>> tupla1
('a', 'b', 'c', 'd')
Exemplo 2
>>> tupla2 = ('a', 'b', 'c', 'd‘)
>>> type(tupla2)
<class 'tuple'>
>>> tupla2
('a', 'b', 'c', 'd')
Tuplas - sintaxe
• Para criar uma tupla com apenas 1 elemento, coloque a
vírgula, caso contrário será uma string
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo certo de criação de tupla
>>> tupla = ('a',)
>>> type(tupla)
<class 'tuple'>
>>> tupla
('a',)
Exemplo errado
>>> tupla = ('a')
>>> type(tupla)
<class ‘string'>
>>> tupla
'a'
Note a vírgula
Fatiando tuplas
• Sintaxe
• tupla[x:y] – seleciona elementos de x a y-1:
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> tupla = ('a', 'b', 'c', 'd', 'e', 'f')
>>> tupla[1:4]
('b', 'c', 'd')
>>> tupla[0:2]
('a', 'b')
>>> tupla[2:]
('c', 'd', 'e', 'f')
>>> tupla[:4]
('a', 'b', 'c', 'd')
Imutabilidade e tuplas
• Apesar de não podermos modificar os elementos,
podemos substituí-la por uma tupla diferente.
• Note que usamos o range e a operação de
concatenação para forjar uma “modificação” de elemento
através da substituição.
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> tupla = ("verdade", "significado", 77)
>>> tupla[0:2]
('verdade', 'significado')
>>> tupla = tupla[0:2] + ("semântica",)
>>> tupla
('verdade', 'significado', 'semântica')
Os valores podem
ter tipos diferentes!
Note a vírgula!
Atribuições com tupla
• Permite que uma tupla de variáveis à esquerda da
atribuição receber valores de uma tupla à direita da
atribuição
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> julia = ("Julia", "Roberts", 1967, "Pretty Woman", 1990, "Atriz", "Atlanta,
Georgia")
>>> (nome, sobrenome, ano_nascimento, filme, ano_filme, profissao,
local_nascimento) = julia
>>> nome
'Julia'
>>> sobrenome
'Roberts'
>>> ano_nascimento
1967
>>> filme
'Pretty Woman'
7 atribuições em uma linha!
Único requisito: número de variáveis
a esquerda tem que ser igual ao
número de elementos da tupla
Empacotando e
Desempacotando
• Outra forma de encarar as tuplas
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo: empacotando
>>> bob = (“Bob”, 19, “ICC”)
Exemplo: desempacotando
>>> bob = (“Bob”, 19, “ICC”)
>>>(nome, idade, estuda) = bob
>>>estuda
‘ICC’
Atribuições com tupla
• Trocar entre si os valores de duas variáveis:
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo com variável temporária
>>> a = 1
>>> b = 2
>>> a, b
(1, 2)
>>> tmp = a
>>> a = b
>>> b = tmp
>>> a, b
(2, 1)
Exemplo com tupla
>>> a, b = 1, 2
>>> a, b
(1, 2)
>>> a, b = b, a
>>> a, b
(2, 1)
Necessário o uso de
variável temporária.
Simplifica tanto a atribuição quanto
a troca de elementos!
Tuplas como valores de retorno
• Funções podem usar tuplas como valor de retorno.
• Então podemos atribuir o valor a uma tupla com a
mesma quantidade de variáveis:
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> import math
>>> def func2grau(a, b, c):
delta = b**2 -4*a*c
x1 = (-b-math.sqrt(delta))/(2*a)
x2 = (-b+math.sqrt(delta))/(2*a)
return x1, x2
>>> x1, x2 = func2grau(1, -5, 6)
>>> x1, x2
(2.0, 3.0)
Composição de
Estruturas de Dados
• Lista de pares (tuplas com dois elementos), sendo que o
segundo elemento da tupla também é uma lista
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo:
aluno = [
(“João”, [“ICC”, “Cálculo 1”, “Física 1”]),
(“Maria”, [“ICC”, “Química”, “Estatística”, “Álgebra”]),
(“José” , [“ICC”, “Estrutura de Dados”]) ]
Composição de
Estruturas de Dados
• Os itens de uma tupla também podem ser tuplas
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> julia = ( ("Julia", "Roberts“) , (8, “outubro”, 1967), "Atriz", "Atlanta - GA“,
[ (“Duplicity”, 2009),
(“Notting Hill”, 1999),
(“Pretty Woman”,1990),
(“Erin Brockovich”, 2000),
(“Eat Pay Love”, 2010),
(“Mona Lisa Smile”, 2003),
(“Oceans Twelve”, 2004),
(“Larry Crowne”, 2011),
(“August: Osage County”, 2013),
(“Mother´s Day”, 2016) ] )
Note que a tupla só tem 5 elementos!
Mas cada elemento pode ser: outra tupla, uma lista, uma string, etc
É uma estrutura de dados heterogênea!
Dicionários
• As tipos compostos que já estudamos são:
• Strings
• Listas e
• Tuplas
• Todas elas são do tipo sequenciais
• Usam inteiros como índices para acessar seus valores
• Dicionários são um outro tipo de composição
• Tipo mapeado
• Mapeiam chaves para valores
• Chave é qualquer tipo imutável
• Valor pode ser qualquer tipo (heterogêneo)
• Também conhecidos como vetores associativos
• Associam uma chave a um valor
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Dicionário inglês-português
• Exemplo: cria-se um dicionário em Python para traduzir
palavras do inglês para o português
• As chaves são strings
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> ingles_portugues = { }
>>> ingles_portugues[“computer”] = “computador”
>>> ingles_portugues[“assignment”] = “atribuição”
>>> ingles_portugues[“alias”] = “apelido”
>>> ingles_portugues
{“alias”: “apelido” , “assignment”: “atribuição”, “computer”:
“computador” }
Cria dicionário vazio
Em seguia adiciona
os elementos
Note que a ordem está diferente...
Dicionários
• Outra maneira de criar dicionários é fornecer uma lista
de pares chaves-valor utilizando a mesma sintaxe da
última saída.
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> ing2port = { “one”: ”um”, “two”:”dois”, “three”:”três” }
Dicionários
• Os pares chave-valor não estão em ordem!
• Felizmente, não há motivos para se preocupar com a
ordem, desde que os elementos do dicionário nunca
sejam indexados com índices inteiros.
• Podemos usar as chaves para buscar os valores
correspondentes:
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> ing2port = { “one”: ”um”, “two”:”dois”, “three”:”três” }
>>>ing2port[“two”]
‘dois’
Hashing
• A ordem dos pares pode ser diferente do esperado
• Python usa algoritmos complexos para determinar onde
o par chave:valor está armazenado no dicionário
• Por que usar dicionários quando se pode usar o mesmo
conceito de mapear chaves em valores usando lista com
tuplas?
• Dicionários são rápidos
• Listas são lentas
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>>{ “maçã”: 130, “pera”: 50, “banana”: 10 }
>>>[ (‘maçã’, 1300), (“pera”, 50), (“banana”, 10 ) ]
Operações
• O comando del remove um par chave-valor de um
dicionário.
• Por exemplo, o dicionário abaixo contém os nomes de
várias frutas e o número de cada fruta no estoque
• Se alguém comprar todas as bananas, podemos excluir
a entrada do dicionário:
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>>estoque = { “maçã”: 130, “pera”: 50, “banana”: 10 }
>>> print(estoque)
{'pera': 50, 'banana': 10, 'maçã': 130}
Exemplo
>>> del estoque["banana"]
>>> print(estoque)
{'pera': 50, 'maçã': 130}
Operações
• Mas se o estoque de bananas for recompletado logo
• Quando chegar novo carregamento de banana...
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> estoque["banana"] = 0
>>> print(estoque)
{'pera': 50, 'banana': 0, 'maçã': 130}
Exemplo
>>> estoque["banana"] = 750
>>> print(estoque)
{'pera': 50, 'banana': 750, 'maçã': 130}
Operações
• E para saber quantos itens (par chave:valor) tem no
estoque
• O operador in e not in (usado também em strings e
listas) é um operador lógico que verifica se uma chave
está no dicionário
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> len(estoque)
3
Exemplo
>>> “banana” in estoque
True
>>>”jaboticaba” not in estoque
True
Métodos
• Um método é semelhante a uma função: possui
parâmetros e retorna valores, mas a sintaxe é diferente
• Por exemplo, o método keys recebe um dicionário e
retorna uma lista com as chaves, mas em vez de
usarmos a sintaxe de função keys(estoque), nós usamos
a sintaxe de método sing2esp.keys()
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> estoque.keys()
dict_keys(['pera', 'banana', 'maçã'])
objeto método ponto
Métodos
• Ao invés de chamarmos um método, dizemos que ele é
invocado, nesse caso, nós podemos dizer que nós
estamos invocando keys do objeto estoque
• O método values é parecido; retorna a lista de valores
de um dicionário
• O método items retorna a dupla, na forma de uma lista
com os pares
• Os colchetes indicam que isso é uma lista
• Os parênteses indicam que os elementos da lista são
tuplas.
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> estoque.values()
dict_values([50, 0, 130])
Exemplo
>>> estoque.items()
dict_items([('pera', 50), ('banana', 0), ('maçã', 130)])
Métodos
• O método keys retorna a lista da chave, logo podemos
usá-lo para percorrer o dicionário
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
for key in estoque.keys(): # a ordem da chave não está definida
print("Quantidade de ", key, “ no estoque é igual a ", estoque[key])
keys = list(estoque.keys())
print(keys)
Saída:
Quantidade de pera no estoque é igual a 50
Quantidade de banana no estoque é igual a 0
Quantidade de maçã no estoque é igual a 130
['pera', 'banana', 'maçã']
Métodos
• Iterar sobre uma chave de um dicionário é algo tão
comum que se pode omitir a invocação do método no
loop for
• Iterar sobre um dicionário subentende-se iterar sobre a
chave
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
for chave in estoque: # a ordem da chave não está definida
print("Quantidade de ", chave, “ no estoque é igual a ",
estoque[chave])
Saída:
Quantidade de pera no estoque é igual a 50
Quantidade de banana no estoque é igual a 0
Quantidade de maçã no estoque é igual a 130
Métodos
• Tuplas também são frequentemente usadas na iteração
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
for (chave, valor) in estoque.items():
print("Quantidade de ", chave, “ no estoqueé igual a ", valor)
Saída:
Quantidade de pera no estoque é igual a 50
Quantidade de banana no estoque é igual a 0
Quantidade de maçã no estoque é igual a 130
Aliasing e Copiar
• Aliasing é um recurso no qual duas variáveis
referenciam a um mesmo objeto
• Quando uma é alterada, a outra também é afetada.
• Se você quer modificar um dicionário e manter uma
cópia original, então o método copy deve ser utilizado.
• oposto é um dicionário de antônimos
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>>oposto = { “alto”: ”baixo”, “direito”: “errado”, “sim”: “não” }
>>>contrario = oposto
>>>antonimo = oposto.copy( )
>>> id(oposto)
49156704
>>> id(contrario)
49156704
>>> id(antonimo)
48899536
Aliasing e Copiar
• oposto e contrario (apelido) se referem ao mesmo
objeto
• antonimo (cópia) se refere a um novo objeto igual ao
dicionário oposto
• Se você modificar o contrario, oposto também será
alterado
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>>oposto = { “alto”: ”baixo”, “direito”: “errado”, “sim”: “não” }
>>>contrario = oposto
>>>antonimo = oposto.copy( )
>>>>>> contrario["direito"] = "esquerdo"
>>> oposto["direito"]
'esquerdo'
Aliasing e Copiar
• Se você modificar o antonimo, oposto não será
alterado
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>>oposto = { “alto”: ”baixo”, “direito”: “errado”, “sim”:
“não” }
>>>contrario = oposto
>>>antonimo = oposto.copy( )
>>>>>> antonimo["direito"] = “deveres"
>>> oposto["direito"]
‘errado'
Matrizes Esparsas
• Seja a matriz esparsa
• Uma representação usando uma lista contém muitos
zeros
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Matrizes Esparsas
• Uma alternativa é usarmos um dicionário. Para as
chaves, nós podemos usar tuplas que contêm os
números da linha e a coluna
• Para se acessar um elemento da matriz, utiliza-se o
operador [ ]:
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo:
>>>matriz = { (0, 3): 1, (2, 1): 2, (4, 3): 3 }
Exemplo
>>>matriz[2, 1]
2
Matrizes Esparsas
• A sintaxe da representação de um dicionário não é a
mesma das listas
• Apenas um índice é usado
• tupla de dois inteiros ao invés de dois inteiros
• Porém, se buscarmos um elemento zero, um erro será
gerado
• não existe entrada no dicionário para a palavra especificada
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> matriz[1, 1]
Traceback (most recent call last):
File "<pyshell#147>", line 1, in <module>
matriz[1, 1]
KeyError: (1, 1)
Matrizes Esparsas
• O método get resolve este problema
• O primeiro parâmetro é a chave
• O segundo é o valor que get retornará caso não exista a
chave no dicionário
• get melhora a semântica e a sintaxe do acesso a
matrizes esparsas
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
>>> matriz.get((2,1), 0)
2
>>> matriz.get((1,1), 0)
0
Dica
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
A recursão gera uma árvore com
números de nós exponencial!
Como evitar isto?
Dica
• Podemos guardar os valores que já foram calculados
armazenando-os em um dicionário
• Desta forma estes valores podem ser utilizados em uma
outra oportunidade
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
previo = {0:1, 1:1}
def fibonacci(n):
if n in previo:
return previo[n]
else:
novoValor = fibonacci(n-1) +
fibonacci(n-2)
previo[n] = novoValor
return novoValor
print(fibonacci(64))
Saída
17167680177565
Contando letras
• Um histograma pode ser útil para comprimir um arquivo
de texto.
• Dicionários fornecem uma maneira elegante de gerar um
histograma
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
contador_letras = {}
for letra in "Universidade de Brasilia":
contador_letras[letra] = contador_letras.get(letra, 0) + 1
print(contador_letras)
Saída
{'U': 1, 'i': 4, 'v': 1, 'n': 1, 'a': 3, 'r': 2, 'e': 3, 'd': 3, ' ': 2, 's': 2,
'l': 1, 'B': 1}
Contando letras
• É mais atraente mostrarmos o histograma na ordem
alfabética
• Podemos fazer isso com os métodos items e sort
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
contador_letras = {}
for letra in "Universidade de Brasilia":
contador_letras[letra] = contador_letras.get(letra, 0) + 1
letras_items = list(contador_letras.items())
letras_items.sort()
print(letras_items)
Saída
[(' ', 2), ('B', 1), ('U', 1), ('a', 3), ('d', 3), ('e', 3), ('i', 4), ('l', 1),
('n', 1), ('r', 2), ('s', 2), ('v', 1)]
Contando letras
• Você já tinha visto o método items
antes, mas sort é o primeiro método
que você se depara para aplicar em
listas
• Existem muitos outros métodos de
listas, incluindo append, extend, e
reverse
• Consulte a documentação do
Python para maiores detalhes
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exercício
• Escreva um programa em Python chamado palavras_alice.py
que cria um arquivo texto chamado palavras_alice.txt
contendo a lista alfabética de todas as palavras e o número de
vezes em que ela aparece no texto da versão “Alice´s
Adventures in Wonderland”
• Obtenha o arquivo em http://www.gutenberg.org utf-8 sem
formatação
• As primeiras 10 linhas do seu arquivo de saída deve ser
parecido com
• Quantas veze a palavra alice aparece no texto?
• Qual é a palavra mais longa? Qual o seu tamanho?
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o
Exemplo
Palavra Contagem
===============================
a 631
a-piece 1
abide 1
able 1
about 94
above 3
Bibliografia
• How to Think Like a Computer Scientist: Learning
with Python 3 – Documentation - Release 3rd Edition
• Peter Wentworth, Jeffrey Elkner,Allen B. Downey and
Chris Meyers
• Apr 26, 2017
D
e
p
a
rt
a
m
e
n
to
d
e
C
iê
n
c
ia
d
a
C
o
m
p
u
ta
ç
ã
o