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(<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回傳。
實作 create_inventory(<input list>) 函式,它會根據輸入的物品陣列建立一份「庫存」。它應該回傳一個dict,其中包含每個物品名稱及其對應的數量。
>>> create_inventory(["coal", "wood", "wood", "diamond", "diamond", "diamond"])
{"coal":1, "wood":2, "diamond":3}
實作 add_items(<inventory dict>, <item list>) 函式,它會將一批物品新增到傳入的庫存中:
>>> add_items({"coal":1}, ["wood", "iron", "coal", "wood"])
{"coal":2, "wood":2, "iron":1}
實作 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}
實作 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}
實作 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)]