Um dicionário (dict) em Python é uma estrutura de dados que associa chaves hashable a valores e é conhecido em outras linguagens de programação como uma tabela hash redimensionável, hashmap ou array associativo.
Os dicionários são o único tipo de mapeamento embutido do Python.
Keys devem ser hashable e únicas em todo o dicionário.
Os tipos de chave podem incluir numbers, str ou tuples (de valores imutáveis).
Eles não podem conter estruturas de dados mutáveis, como lists, dicts ou sets.
A partir do Python 3.7, a ordem das chaves de um dict é garantida como a ordem em que as entradas são inseridas.
values podem ser de qualquer tipo ou estrutura de dados.
Os valores também podem se aninhar arbitrariamente, então podem incluir listas de listas, subdicionários e outras estruturas de dados personalizadas ou compostas.
Dada uma key, os dicionários conseguem recuperar um value em tempo constante (em média) (independente do número de entradas).
Comparado a procurar um valor dentro de uma list ou array (sem saber a posição do index), um dict usa bem mais memória, mas tem recuperação muito rápida.
Os dicionários são especialmente úteis em cenários em que a coleção de itens é grande e precisa ser acessada e atualizada com frequência.
Dicionários podem ser criados de várias formas.
As duas mais diretas são usar o construtor dict() ou declarar um literal de dict.
dict()
O dict() (o construtor da classe de dicionário) pode ser usado com qualquer iterável de pares key, value ou com uma série de argumentos <name>=<value>:
#Passing a list of key,value tuples.
>>> wombat = dict([('name', 'Wombat'),('speed', 23),('land_animal', True)])
{'name': 'Wombat', 'speed': 23, 'land_animal': True}
#Using key=value arguments.
>>> bear = dict(name="Black Bear", speed=40, land_animal=True)
{'name': 'Black Bear', 'speed': 40, 'land_animal': True}
Um dict também pode ser escrito diretamente como um literal de dicionário, usando chaves ({}) em volta de pares key : value:
>>> whale = {"name": "Blue Whale", "speed": 35, "land_animal": False}
{'name': 'Blue Whale', 'speed': 35, 'land_animal': False}
Você pode acessar uma entrada de um dicionário usando uma chave entre colchetes ([]).
Se uma key não existir no dict, um KeyError é lançado:
>>> bear["speed"]
40
>>> bear["color"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'color'
Acessar uma entrada pelo método .get(<key>, <default value>) pode evitar o KeyError:
>>> bear.get("color", 'not found')
'not found'
Você pode alterar o value de uma entrada atribuindo à sua chave:
#Assigning the value "Grizzly Bear" to the name key.
>>> bear["name"] = "Grizzly Bear"
{'name': 'Grizzly Bear', 'speed': 40, 'land_animal': True}
>>> whale["speed"] = 25
{'name': 'Blue Whale', 'speed': 25, 'land_animal': False}
Novos pares key:value podem ser adicionados da mesma forma:
# Adding a new "color" key with a new "tawney" value.
>>> bear["color"] = 'tawney'
{'name': 'Grizzly Bear', 'speed': 40, 'land_animal': True, 'color': 'tawney'}
>>> whale["blowholes"] = 1
{'name': 'Blue Whale', 'speed': 25, 'land_animal': False, 'blowholes': 1}
Você pode usar o método .pop(<key>) para excluir uma entrada de um dicionário.
O .pop() remove o par (key, value) e retorna o value para uso.
Assim como o .get(), o .pop(<key>) aceita um segundo argumento (dict.pop(<key>, <default value>)) que será retornado se a key não for encontrada.
Isso evita que um KeyError seja lançado:
#Using .pop() removes both the key and value, returning the value.
>>> bear.pop("name")
'Grizzly Bear'
#The "name" key is now removed from the dictionary.
#Attempting .pop() a second time will throw a KeyError.
>>> bear.pop("name")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'name'
#Using a default argument with .pop() will prevent a KeyError from a missing key.
>>> bear.pop("name", "Unknown")
'Unknown'
Percorrer um dicionário com for item in dict ou while item itera por padrão apenas sobre as chaves.
Você pode acessar os valores dentro do mesmo laço usando colchetes:
>>> for key in bear:
>>> print((key, bear[key])) #this forms a tuple of (key, value) and prints it.
('name', 'Black Bear')
('speed', 40)
('land_animal', True)
Você também pode usar o método .items(), que retorna tuplas (key, value) automaticamente:
#dict.items() forms (key, value tuples) that can be unpacked and iterated over.
>>> for key, value in whale.items():
>>> print(key, ":", value)
name : Blue Whale
speed : 25
land_animal : False
blowholes : 1
Da mesma forma, o método .keys() retorna keys e o método .values() retorna os values.
Neste exercício, você vai gerenciar um sistema de inventário.
O inventário deve ser organizado pelo nome do item e deve manter o controle da quantidade de itens disponíveis.
Você vai precisar lidar com a adição de itens a um inventário.
Cada vez que um item aparecer em uma determinada lista, a quantidade desse item no inventário deve aumentar em 1.
Você também vai precisar lidar com a remoção de itens de um inventário, diminuindo as quantidades em 1 quando solicitado.
Por fim, você vai precisar implementar uma função que retorne todos os pares chave-valor de um determinado inventário como uma list de tuples.
Implemente a função create_inventory(<input list>), que cria um "inventário" a partir de uma lista de itens de entrada.
Ela deve retornar um dict contendo cada nome de item junto com sua respectiva quantidade.
>>> create_inventory(["coal", "wood", "wood", "diamond", "diamond", "diamond"])
{"coal":1, "wood":2, "diamond":3}
Implemente a função add_items(<inventory dict>, <item list>), que adiciona uma lista de itens ao inventário passado:
>>> add_items({"coal":1}, ["wood", "iron", "coal", "wood"])
{"coal":2, "wood":2, "iron":1}
Implemente a função decrement_items(<inventory dict>, <items list>), que recebe uma list de itens.
Sua função deve remover 1 da contagem de um item para cada vez que esse item aparecer na list:
>>> decrement_items({"coal":3, "diamond":1, "iron":5}, ["diamond", "coal", "iron", "iron"])
{"coal":2, "diamond":0, "iron":3}
As contagens de itens no inventário não podem ficar abaixo de 0.
Se o número de vezes que um item aparece na list de entrada exceder a contagem disponível, a quantidade registrada para esse item deve permanecer em 0.
As solicitações adicionais para remover contagens devem ser ignoradas depois que a contagem chegar a zero.
>>> decrement_items({"coal":2, "wood":1, "diamond":2}, ["coal", "coal", "wood", "wood", "diamond"])
{"coal":0, "wood":0, "diamond":1}
Implemente a função remove_item(<inventory dict>, <item>), que remove um item e sua contagem por completo de um inventário:
>>> remove_item({"coal":2, "wood":1, "diamond":2}, "coal")
{"wood":1, "diamond":2}
Se o item não for encontrado no inventário, a função deve retornar o inventário original sem alterações.
>>> remove_item({"coal":2, "wood":1, "diamond":2}, "gold")
{"coal":2, "wood":1, "diamond":2}
Implemente a função list_inventory(<inventory dict>), que recebe um inventário e retorna uma lista de tuples no formato (item, quantity).
A lista deve incluir apenas os itens disponíveis (com quantidade maior que zero):
>>> list_inventory({"coal":7, "wood":11, "diamond":2, "iron":7, "silver":0})
[('coal', 7), ('diamond', 2), ('iron', 7), ('wood', 11)]
Crie sua conta no Exercism para aprender e dominar Python com 17 conceitos146 exercícios e mentoria humana de verdade, tudo de graça.