學習軌道
/
Python
Python
/
練習
/
庫存管理
庫存管理

庫存管理

學習練習

簡介

Python 中的字典(dict)是一種資料結構,會將可雜湊的鍵_對應到_值,在其他程式語言中稱為可調整大小的雜湊表、hashmap 或關聯陣列。字典是 Python 唯一內建的對應型別。

Keys在字典中必須是可雜湊且唯一的。鍵的型別可以是numbers、str或tuples(由_不可變_的值組成)。它們不能包含_可變_的資料結構,例如lists、dict或set。從 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。

最後,你需要實作一個函式,將指定庫存中的所有鍵值對以tuples組成的list回傳。

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。每當某個物品在該list中出現一次,你的函式就應該將該物品的計數減去1:

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

庫存中的物品計數不應低於 0。如果某個物品在輸入list中出現的次數超過可用的計數,該物品所列的數量應維持在 0。一旦計數降為 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)元組組成的陣列。該陣列應只包含_可用_的物品(數量高於 0):

>>> list_inventory({"coal":7, "wood":11, "diamond":2, "iron":7, "silver":0})
[('coal', 7), ('diamond', 2), ('iron', 7), ('wood', 11)]
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Python Exercism

準備好開始 庫存管理 了嗎?

註冊 Exercism,透過 17 個概念146 個練習 和真人引導來學習並精通 Python,全部免費。