2.17. Dicionários

Tipo de conjunto onde os valores são indexados por chaves que, em geral, são números inteiros ou strings. Também são denominados de arrays associativos ou dicionários. Trata-se de um tipo útil para criar objetos que agregam diversos valores que por sua vez podem ser referenciados por chaves específicas.

Vamos representar um registro com informações sobre a cidade de São Paulo:

Trecho de Código 2.16 - Criando um dicionário com informações da cidade de São Paulo.
1sao_paulo = {
2    "name" : "São Paulo",
3    "woeid" : 12582314,
4    "bounding-box" : ((-46.82, -24.00), (-46.36, -23.68)),
5    "country" : "Brazil"
6}

No Trecho de Código 2.16, o objeto associado à variável (ou identificador) sao_paulo é um dicionário. Dicionários são objetos cujos elementos são delimitados por chaves ({ e }) e separados por vírgula. Os elementos por sua vez, são pares pares chave-valor, separados pelo caractere :. Nesse trecho de código, todas as chaves são representadas por strings, mas é possível utilizar valores de qualquer tipo comparável e que seja imutável. Isto significa que podemos utilizar como chaves, números inteiros, strings e tuplas (formadas por números e strings), mas não podemos utilizar listas. Além disso, as chaves devem ter valores únicos, uma vez que são usadas para identificar um valor associado. Repare também que os valores pertencem a tipos de dados variados:

  • name se refere à string São Paulo;

  • woeid se refere a um número inteiro (12582314);

  • bounding-box se refere a uma tupla;

  • country a uma string (Brazil).

Vamos criar dois novos dicionários com as localizações de São José dos Campos e Ouro Preto, respectivamente:

# São José dos Campos
sjc = {
    "longitude": -45.88,
    "latitude": -23.17
}
# Ouro Preto
ouro_preto = {
    "longitude": -43.50,
    "latitude": -20.38
}
>>> print(sjc)
{'longitude': -45.88, 'latitude': -23.17}

Podemos acessar os valores individuais dos dicionários através do operador[]:

>>> longitude = sjc["longitude"]
>>> print(longitude)
-45.88

Nota

Caso a chave informada não exista, o acesso ao item através do operador[] lança uma exceção do tipo KeyError.

Outra forma de acesso aos elementos de um dicionário é através do método get:

>>> longitude = sjc.get("longitude")
>>> print(longitude)
-45.88

Nota

A diferença básica entre o operador[] e o método get, é que o segundo permite informar um valor padrão (ou default) para ser usado caso a chave não seja encontrada. Além disso, o método get não lança exceção caso a chave não exista:

>>> altitude = sjc.get("altitude")
>>> print(altitude)
None
>>> altitude = ouro_preto.get("altitude", 0.0)
>>> print(altitude)
0.0

Dicionários são objetos mutáveis, isto é, pode-se alterar os valores associados às chaves, ou incluir novos pares chave-valor, ou remover elementos existentes:

>>> sjc["latitude"] = -20.379
>>> print(sjc)
{'longitude': -45.88, 'latitude': -20.379}
>>> del sjc["longitude"]
>>> print(sjc)
{'latitude': -20.379}
>>> sjc["longitude"] = -45.88
>>> print(sjc)
{'latitude': -20.379, 'longitude': -45.88}

Podemos testar se uma chave encontra-se em um dicionário usando o operador in:

>>> "longitude" in sjc
True

De maneira análoga, podemos usar o operador not in:

>>> "latitude" not in sjc
False

Para saber o número de elementos em um dicionário, pode-se utilizar a função len:

>>> len(sao_paulo)
4

Se usarmos o construtor de listas com um dicionário como argumento, objetos uma lista com todos as chaves do dicionário na ordem em que elas foram incluídas:

>>> list(sao_paulo)
['name', 'woeid', 'bounding-box', 'country']

Dica

Se você quiser construir uma lista das chaves de maneira ordenada, use a função sorted:

>>> list(sorted(sao_paulo))
['bounding-box', 'country', 'name', 'woeid']

Também podemos criar dicionários através do construtor dict informando uma sequência de pares chave-valor:

>>> dict([("xmin", -46.8254), ("ymin", -24.0084), ("xmax", -46.3648), ("ymax", -23.6830)])
{'xmin': -46.8254, 'ymin': -24.0084, 'xmax': -46.3648, 'ymax': -23.683}

Nota

Uma forma simplificada bastante empregada de criar dicionários é através pares de argumentos nomeados:

>>> dict( longitude=-45.88, latitude=-23.17)
{'longitude': -45.88, 'latitude': -23.17}

Nota

  • Dicionários podem ser alterados (mutáveis).

  • O dicionário vazio é representado por: d = {}

  • Uma chave em um dicionário pode estar associada a outro dicionário.

  • Uma chave pode estar associada a uma lista.

  • Não podemos usar listas como chaves, uma vez que podemos modificá-las.

2.17.1. Dict Comprehension

Podemos criar dicionários utilizando a notação de dict comprehensions:

>>> xs = [ 1, 2, 3, 4, 5 ]

>>> f = { x: (1.5 * x - 3) for x in xs }

>>> print(f)
{1: -1.5, 2: 0.0, 3: 1.5, 4: 3.0, 5: 4.5}

>>> print(f[3])
1.5

Nota

Para mais detalhes sobre a estrutura dict, consulte [27] e [20].