Aliases, cópias
Dicionários
Os tipos de dados compostos que estudamos até ao momento (strings,
listas, tuplos) são
sequenciais
:
coleções de dados ordenadas da esquerda para a direita; índice 0 para o primeiro elemento, 1 para o seguindo, . . . acesso aos valores guardados é feito com índices inteiros.
Dicionários
são também coleções de dados, mas:
1 associam umachave a um valor
2 chave (em inglês: key): deve ser de um tipoimutável 3 valor: qualquer objeto do Python
4 não há uma ordem para os valores guardados
Aliases, cópias
Dicionários: representação
Dicionário vazio: {}
Acesso e atribuição de valores: []
>>> quant = {} >>> quant[’bananas’] = 5 >>> quant[’apples’] = 7 >>> quant[’pears’] = 12 >>> quant[’oranges’] = 4 >>> quant
{’oranges’: 4, ’bananas’: 5, ’pears’: 12, ’apples’: 7} >>> print(quant[’pears’])
12
>>> quant[’bananas’] += 3 >>> quant
{’oranges’: 4, ’bananas’: 8, ’pears’: 12, ’apples’: 7}
Neste padrão:
1 começamos com dicionário vazio 2 adicionamos pares chave-valor
Aliases, cópias
Dicionários: outra forma de inicialização
>>> quant = {’oranges’: 4, ’bananas’: 5, ’pears’: 12, ’apples’: 7} >>> quant
{’pears’: 12, ’bananas’: 5, ’oranges’: 4, ’apples’: 7}
Alternativa à forma de construção a partir de dicionário vazio;
Pares chave-valor, separados por dois pontos (:).
Aliases, cópias
Dicionários: exemplo do livro
Dicionário inglês-espanhol:
eng2sp = {} eng2sp[’one’] = ’uno’ eng2sp[’two’] = ’dos’ eng2sp[’three’] = ’tres’ print(eng2sp)Output:
{’three’: ’tres’, ’two’: ’dos’, ’one’: ’uno’}
A ordem dos pares pode não ser o que esperamos:
resulta de algoritmos desenhados com vista ao acesso rápido aos elementos;
é desse algoritmos (funções de hash) que resulta a ordem por que os elementos aparecem;
Aliases, cópias
Operações com dicionários
Dicionários são
mutáveis
; podemos operar sobre os seus valores,
modificando-os.
quant = {’oranges’: 4, ’bananas’: 5, ’pears’: 12, ’apples’: 7}
acesso/alteracao do valor:
quant[’bananas’] = 7
remoção um par chave–valor:
>>> del quant[’oranges’] >>> quant
{’pears’: 12, ’bananas’: 7, ’apples’: 7}
tamanho de um dicionário:
>>> len(quant) 3
Aliases, cópias
Métodos de dicionários
Method Parameters Description
keys none Returns a view of the keys in the dictionary values none Returns a view of the values in the dictionary items none Returns a view of the key-value pairs in the
dicti-onary
get key Returns the value associated with key; None otherwise
get key,alt Returns the value associated with key; alt otherwise
Aliases, cópias
Percorrer um dicionário
Tal como com listas, podemos iterar através dos elementos de um
dicionário:
quant = {’oranges’: 4, ’bananas’: 5, ’pears’: 12, ’apples’: 7} for key in quant.keys():
print("Value for key ’%s’: %s" % (key, quant[key]))
Output:
Value for key ’pears’: 12 Value for key ’bananas’: 5 Value for key ’oranges’: 4 Value for key ’apples’: 7
A ordem pela qual as chaves do dicionários aparecem não está definida.
É tao frequente iterar sobre as chaves de um dicionário que é permitido
omitir o método .keys():
quant = {’oranges’: 4, ’bananas’: 5, ’pears’: 12, ’apples’: 7} for key in quant:
Aliases, cópias
Utilização de mais alguns métodos
Exemplo com os métodos mais utilizados:
>>> quant = {’oranges’: 4, ’bananas’: 5, ’pears’: 12, ’apples’: 7} >>> list(quant.keys())
[’pears’, ’bananas’, ’oranges’, ’apples’] >>> list(quant.values())
[12, 5, 4, 7]
>>> list(quant.items())
[(’pears’, 12), (’bananas’, 5), (’oranges’, 4), (’apples’, 7)]
Valores e chaves podem ser convertidos para listas;
O método items devolve uma lista de tuplos, cada um contendo uma
chave e o valor a ela associado.
Outra forma de percorrer um dicionário:
quant = {’oranges’: 4, ’bananas’: 5, ’pears’: 12, ’apples’: 7} for (k,v) in quant.items():
print("Value for key ’%s’: %s" % (k, v))
Output:
Value for key ’pears’: 12 Value for key ’bananas’: 5 Value for key ’oranges’: 4 Value for key ’apples’: 7
Aliases, cópias
Operadores in, not in
Os operadores in e not in permitem testar se uma chave está (ou
não) num dicionário:
quant = {’oranges’: 4, ’bananas’: 5, ’pears’: 12, ’apples’: 7} if ’bananas’ in quant:
print("yes, we have bananas") else:
print("sorry, no bananas")
Output:
yes, we have bananas
Se tentarmos aceder ao valor de uma chave inexistente no dicionário,
há um erro de execução;
Uma possibilidade é testarmos se a chave existe com in;
Outra possibilidade: método get
>>> quant = {’oranges’: 4, ’bananas’: 5, ’pears’: 12, ’apples’: 7} >>> quant.get(’bananas’)
5
>>> quant.get(’kiwi’) >>> quant.get(’kiwi’,7) 7
Aliases, cópias
Aliases e cópias de dicionários
Como os dicionários são mutáveis, é necessário precaução com aliases
(tal como com listas);
Quando duas variáveis se referem ao mesmo objeto, alterações numa
delas refletem-se na outra;
Exemplo:
>>> opposites = {’up’: ’down’, ’right’: ’wrong’, ’true’: ’false’} >>> alias = opposites >>> alias is opposites True >>> alias[’right’] = ’left’ >>> opposites[’right’] ’left’
Para fazer cópia: método copy():
>>> opposites = {’up’: ’down’, ’right’: ’wrong’, ’true’: ’false’} >>> acopy = opposites.copy()
>>> acopy[’right’] = ’left’ >>> acopy
{’right’: ’left’, ’true’: ’false’, ’up’: ’down’} >>> opposites
Aliases, cópias
Matrizes esparsas
Matrizes esparsas são matrizes com poucos elementos não nulos;
Com listas (contém muita redundância):
matrix = [[0, 0, 0, 1, 0], [0, 0, 0, 0, 0], [0, 2, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 3, 0]]
Com dicionários: especifica-se apenas os elementos não nulos:
matrix = {(0, 3): 1, (2, 1): 2, (4, 3): 3}
Para aceder a elementos da matriz:
1 lista de listas: dupla indexação, e.g. matrix[1][3]
2 dicionário: índices são tuplos de inteiros, e.g. matrix[(1,3)] (ou matrix[1,3])
Aliases, cópias
Matrizes esparsas
Problema: acesso a elementos inexistentes com matrix[i,j] dá erro
1 testar com in antes de aceder a um elemento;
2 melhor: utilizar o método get: matrix.get((i,j), 0) >>> matrix.get((1,3))
>>> matrix = {(0, 3): 1, (2, 1): 2, (4, 3): 3} >>> matrix[(1,3)]
Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: (1, 3)
>>> matrix.get((1,3)) >>> matrix.get((1,3), 0) 0
Aliases, cópias
Noções estudadas esta semana
dicionário
coleção de pares (chave, valor); chaves podem ser de
qualquer tipo imutável, e valores de qualquer tipo
chave
item que é associado a um valor num dicionário; é usado
para localizar valores no dicionário
par chave-valor
cada um dos items guardado no dicionário
Aliases, cópias