Треки
/
Python
Python
/
Вправи
/
Управління запасами
Управління запасами

Управління запасами

Навчальна вправа

Вступ

Словник (dict) у Python - це структура даних, яка повʼязує хешовані ключі зі значеннями і відома в інших мовах програмування як хеш-таблиця, що змінює розмір, хеш-відображення або асоціативний масив. Словники - це єдиний вбудований тип відображення у Python.

Keys мають бути хешованими й унікальними в межах словника. Типи ключів можуть включати numbers, str або tuples (зі незмінних значень). Вони не можуть містити змінні структури даних, як-от lists, dicts або sets. Починаючи з Python 3.7, порядок ключів у dict гарантовано збігається з порядком, у якому додано записи.

values можуть бути будь-якого типу даних або структури. Значення також можуть вкладатися довільно, тож вони можуть містити списки списків, підсловники та інші власні чи складені структури даних.

За заданим key словники можуть отримати value за (у середньому) сталий час (незалежно від кількості записів). Порівняно з пошуком значення в list чи array (без знання позиції index), dict використовує значно більше памʼяті, але забезпечує дуже швидкий доступ. Словники особливо корисні в ситуаціях, коли набір елементів великий і до нього потрібно часто звертатися та оновлювати його.

Створення словників

Словники можна створювати багатьма способами. Два найпростіші: скористатися конструктором dict() або оголосити літерал dict.

Конструктор класу dict()

dict() (конструктор класу словників) можна застосувати до будь-якого обʼєкта, який можна перебрати, де елементи є парами key, value, або до низки аргументів вигляду <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}

Літерали словників

dict також можна задати безпосередньо як літерал словника, використовуючи фігурні дужки ({}), які охоплюють пари key : value:

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

Доступ до значень у словнику

Щоб отримати запис зі словника, використовують ключ у квадратних дужках ([]). Якщо key відсутній у dict, виникає KeyError:

>>> bear["speed"]
40

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

Звернення до запису через метод .get(<key>, <default value>) дозволяє уникнути KeyError:

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

Зміна та додавання значень у словнику

Можна змінити value запису, присвоївши його ключу нове значення:

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

Нові пари key:value можна додати у такий самий спосіб:

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

Видалення (Pop) записів зі словника

Щоб видалити запис зі словника, використовують метод .pop(<key>). .pop() видаляє пару (key, value) і повертає value, щоб ним можна було скористатися. Як і .get(), .pop(<key>) приймає другий аргумент (dict.pop(<key>, <default value>)), який буде повернуто, якщо key не знайдено. Це запобігає виникненню 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'

Перебирання словника в циклі

Перебираючи словник за допомогою for item in dict або while item, ми типово проходимо лише за ключами. У тому самому циклі можна дістатися до значень за допомогою квадратних дужок:

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

Також можна використати метод .items(), який автоматично повертає кортежі (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

Так само метод .keys() повертає keys, а метод .values() повертає values.

Вказівки

У цій вправі ми будемо керувати системою інвентарю.

Інвентар має бути впорядкований за назвою предмета й зберігати кількість наявних предметів.

Нам доведеться додавати предмети до інвентарю. Щоразу, коли предмет трапляється в наведеному списку, кількість цього предмета в інвентарі має збільшуватися на 1. Також нам доведеться видаляти предмети з інвентарю, зменшуючи кількість на 1 на запит.

Нарешті, нам потрібно реалізувати функцію, яка повертатиме всі пари ключ-значення з наведеного інвентарю як list із tuples.

1. Створіть інвентар на основі списку

Реалізуймо функцію create_inventory(<input list>), яка створює «інвентар» із вхідного списку предметів. Вона має повертати dict, що містить кожну назву предмета в парі з відповідною кількістю.

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

2. Додайте предмети зі списку до наявного словника

Реалізуймо функцію add_items(<inventory dict>, <item list>), яка додає список предметів до переданого інвентарю:

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

3. Зменште кількість предметів в інвентарі

Реалізуймо функцію decrement_items(<inventory dict>, <items list>), яка приймає list предметів. Наша функція має віднімати 1 від кількості предмета щоразу, коли цей предмет трапляється в list:

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

Кількість предметів в інвентарі не повинна опускатися нижче 0. Якщо предмет трапляється у вхідному list більше разів, ніж є в наявності, указана кількість цього предмета має залишатися на 0. Додаткові запити на зменшення кількості слід ігнорувати, щойно кількість падає до нуля.

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

4. Повністю вилучіть запис з інвентарю

Реалізуймо функцію remove_item(<inventory dict>, <item>), яка повністю вилучає предмет і його кількість з інвентарю:

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

Якщо предмета немає в інвентарі, функція має повернути початковий інвентар без змін.

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

5. Поверніть весь вміст інвентарю

Реалізуймо функцію list_inventory(<inventory dict>), яка приймає інвентар і повертає список кортежів виду (item, quantity). До списку мають потрапити лише наявні предмети (з кількістю, більшою за нуль):

>>> list_inventory({"coal":7, "wood":11, "diamond":2, "iron":7, "silver":0})
[('coal', 7), ('diamond', 2), ('iron', 7), ('wood', 11)]
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Python Exercism

Час розпочати Управління запасами?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.