Percursos
/
Python
Python
/
Exercícios
/
Gestão de inventário
Gestão de inventário

Gestão de inventário

Exercício de aprendizagem

Introdução

Um dicionário (dict) em Python é uma estrutura de dados que associa chaves hashable a valores e é conhecido noutras linguagens de programação como tabela de hash redimensionável, hashmap ou array associativo. Os dicionários são o único tipo de mapeamento incorporado do Python.

Keys têm de ser hashable e únicas em todo o dicionário. Os tipos de chave podem incluir numbers, str ou tuples (de valores imutáveis). 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 é garantidamente a ordem pela qual as entradas são inseridas.

values podem ser de qualquer tipo ou estrutura de dados. Os valores também podem ser aninhados de forma arbitrária, pelo que podem incluir listas de listas, subdicionários e outras estruturas de dados personalizadas ou compostas.

Dada uma key, os dicionários conseguem obter um value em tempo constante (em média) (independentemente do número de entradas). Em comparação com a procura de um valor numa list ou num array (sem saberes a posição do index), um dict usa bastante mais memória, mas a obtenção é muito mais rápida. Os dicionários são especialmente úteis em cenários em que a coleção de itens é grande e tem de ser acedida e atualizada com frequência.

Construção de dicionários

Os dicionários podem ser criados de várias formas. As duas mais diretas são usar o construtor dict() ou declarar um literal dict.

O construtor da classe dict()

O dict() (o construtor da classe dos dicionários) 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}

Literais de dicionário

Um dict também pode ser introduzido diretamente como um literal de dicionário, usando chavetas ({}) que envolvem pares key : value:

>>> whale = {"name": "Blue Whale", "speed": 35, "land_animal": False}
{'name': 'Blue Whale', 'speed': 35, 'land_animal': False}

Aceder a valores num dicionário

Podes aceder a uma entrada de um dicionário usando uma chave entre parênteses retos ([]). Se uma key não existir no dict, é lançado um KeyError:

>>> bear["speed"]
40

>>> bear["color"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'color'

Aceder a uma entrada através do método .get(<key>, <default value>) pode evitar o KeyError:

>>> bear.get("color", 'not found')
'not found'

Alterar ou adicionar valores a um dicionário

Podes 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}

Remover (com pop) entradas de um dicionário

Podes usar o método .pop(<key>) para eliminar uma entrada de um dicionário. O .pop() remove o par (key, value) e devolve o value para ser usado. Tal como o .get(), o .pop(<key>) aceita um segundo argumento (dict.pop(<key>, <default value>)) que é devolvido se a key não for encontrada. Isto evita que seja lançado um KeyError:

#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 ou iterar sobre um dicionário

Percorrer um dicionário com for item in dict ou while item itera, por predefinição, apenas sobre as chaves. Podes aceder aos valores dentro do mesmo ciclo usando parênteses retos:

>>> 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)

Também podes usar o método .items(), que devolve automaticamente tuplos (key, value):

#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

Do mesmo modo, o método .keys() devolve as keys e o método .values() devolve os values.

Instruções

Neste exercício, vais gerir um sistema de inventário.

O inventário deve ser organizado pelo nome do item e deve manter o registo do número de itens disponíveis.

Vais ter de tratar da adição de itens a um inventário. Sempre que um item aparece numa determinada lista, a quantidade desse item no inventário deve aumentar em 1. Também vais ter de tratar da remoção de itens de um inventário, diminuindo as quantidades em 1 quando tal for pedido.

Por fim, vais ter de implementar uma função que devolva todos os pares chave-valor de um determinado inventário como uma list de tuples.

1. Criar um inventário a partir de uma lista

Implementa a função create_inventory(<input list>) que cria um "inventário" a partir de uma lista de itens fornecida como entrada. Deve devolver um dict que contém cada nome de item associado à respetiva quantidade.

>>> create_inventory(["coal", "wood", "wood", "diamond", "diamond", "diamond"])
{"coal":1, "wood":2, "diamond":3}

2. Adicionar itens de uma lista a um dicionário existente

Implementa a função add_items(<inventory dict>, <item list>) que adiciona uma lista de itens ao inventário recebido:

>>> add_items({"coal":1}, ["wood", "iron", "coal", "wood"])
{"coal":2, "wood":2, "iron":1}

3. Decrementar itens do inventário

Implementa a função decrement_items(<inventory dict>, <items list>), que recebe uma list de itens. A tua função deve subtrair 1 à contagem de um item por cada vez que esse item aparece na list:

>>> decrement_items({"coal":3, "diamond":1, "iron":5}, ["diamond", "coal", "iron", "iron"])
{"coal":2, "diamond":0, "iron":3}

A contagem de itens no inventário não pode 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 registada para esse item deve permanecer em 0. Depois de a contagem chegar a zero, os pedidos adicionais de remoção devem ser ignorados.

>>> decrement_items({"coal":2, "wood":1, "diamond":2}, ["coal", "coal", "wood", "wood", "diamond"])
{"coal":0, "wood":0, "diamond":1}

4. Remover uma entrada do inventário por completo

Implementa a função remove_item(<inventory dict>, <item>), que remove um item e a sua contagem do 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 devolver o inventário original sem alterações.

>>> remove_item({"coal":2, "wood":1, "diamond":2}, "gold")
{"coal":2, "wood":1, "diamond":2}

5. Devolver todo o conteúdo do inventário

Implementa a função list_inventory(<inventory dict>), que recebe um inventário e devolve uma lista de tuples (item, quantity). A lista só deve incluir os itens disponíveis (com uma quantidade superior a zero):

>>> list_inventory({"coal":7, "wood":11, "diamond":2, "iron":7, "silver":0})
[('coal', 7), ('diamond', 2), ('iron', 7), ('wood', 11)]
Editar via GitHub A ligação abre numa nova janela ou separador
Python Exercism

Estás pronto para começar Gestão de inventário?

Inscreve-te no Exercism para aprenderes e dominares Python com 17 conceitos146 exercícios, e mentoria humana real, tudo grátis.