本章目錄
- Part One:基本概念
- Part Two:常用方法
在Java里醒颖,存在一種K(key)-V(value)對應關系(鍵值對)的數(shù)據(jù)結構,稱之為Map篓冲。
而Python中也有類似的結構,那就是dict(字典)。之所以叫字典粹湃,是因為我們可以把key想象成字典中的單詞,而value就是該單詞的釋義了泉坐。所以呢为鳄,一個單詞可以對應一個或者多個釋義,但是這些釋義只能通過單詞來查詢腕让。
需要注意的是孤钦,字典中key都是唯一的。每個key只會對應1個value纯丸。所謂的一個單詞對應多個釋義偏形,是因為這個釋義是List類型的,而不是說有多個value觉鼻。
字典具有極快的查找速度俊扭。
基本概念
- 空字典
# Python使用{}或者dict()來創(chuàng)建空字典
dict1 = {}
# type可以查看對象的類型
print(type(dict1))
dict2 = dict()
print(type(dict2))
結果為:
<class 'dict'>
<class 'dict'>
- 初始化字典
# 可以用key-value的形式初始化字典
dict_nba = {"LeBron James": "Cleveland Cavaliers", "James Harden": "Houston Rockets",
"Stephen Curry": "Golden State Warriors"}
# 打印字典
print(dict_nba)
# 打印該鍵對應的值
print(dict_nba["James Harden"])
結果為
{'LeBron James': 'Cleveland Cavaliers', 'James Harden': 'Houston Rockets', 'Stephen Curry': 'Golden State Warriors'}
Houston Rockets
- 插入鍵值對
# dict()創(chuàng)建字典的方式之一
# 此處用dict方式而不是{}方式,是因為{}方式會報This dictionary creation could be rewritten as a dictionary literal.警告
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
("Stephen Curry", "Golden State Warriors")])
# 直接給 dict[key] 賦值即可完成插入操作
dict_nba["Kevin Durant"] = "Golden State Warriors"
print(dict_nba)
結果為:
{'LeBron James': 'Cleveland Cavaliers', 'James Harden': 'Houston Rockets', 'Stephen Curry': 'Golden State Warriors', 'Kevin Durant': 'Golden State Warriors'}
- 更新鍵值
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
("Stephen Curry", "Golden State Warriors")])
# 給同樣的key坠陈,指定另外一個值萨惑。結果為key相同,值覆蓋
dict_nba["Kevin Durant"] = "Oklahoma City Thunder"
print(dict_nba)
結果為:
{'LeBron James': 'Cleveland Cavaliers', 'James Harden': 'Houston Rockets', 'Stephen Curry': 'Golden State Warriors', 'Kevin Durant': 'Oklahoma City Thunder'}
- 字典沒有順序
當我們print一個字典時仇矾,Python并不一定按照插入鍵值的先后順序進行顯示,因為字典中的鍵本身不一定是有序的庸蔼。如果想讓字典有序,需要制定相應的規(guī)則對key排序贮匕。
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
("Stephen Curry", "Golden State Warriors")])
# 字典不支持使用數(shù)字index來查看字典中的值姐仅,因為數(shù)字也是可以作為索引的,容易造成混淆
print(dict_nba[0])
結果為:
KeyError: 0
- 鍵必須是不可變的
Python中要求字典中的鍵值對的鍵必須是不可變的,而值可以是任意的Python對象萍嬉。
這是因為dict根據(jù)key來計算value的存儲位置乌昔,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了壤追。這個通過key計算位置的算法稱為哈希算法(Hash)磕道。
要保證hash的正確性,作為key的對象就不能變行冰。
不過溺蕉,鍵的類型可以是不同類型的。
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
("Stephen Curry", "Golden State Warriors")])
dict_nba[1] = "Oklahoma City Thunder"
dict_nba["Dwight Howard"] = ["Orlando Magic", "Los Angeles Lakers", "Houston Rockets",
"Atlanta Hawks", "Charlotte Hornets"]
print(dict_nba)
結果為:
{'LeBron James': 'Cleveland Cavaliers', 'James Harden': 'Houston Rockets', 'Stephen Curry': 'Golden State Warriors', 1: 'Oklahoma City Thunder', 'Dwight Howard': ['Orlando Magic', 'Los Angeles Lakers', 'Houston Rockets', 'Atlanta Hawks', 'Charlotte Hornets']}
- 適合做鍵的類型
通常悼做,我們習慣使用字符串或者整數(shù)來作為鍵疯特。
List是可變的,不能作為鍵肛走,會報unhashable type異常漓雅,就是無法哈希化朽色。
浮點數(shù)雖然也是不可變的邻吞,但是最好不要使用浮點數(shù)作為鍵,因為浮點數(shù)在進行數(shù)學運算后會損失精度葫男,比如1.1 + 2.2和3.3其實是兩個不同的鍵抱冷。
元組不可變,且是有序的梢褐,可以作為鍵旺遮,但是使用時必須保證元祖內不包含list。
總之盈咳,作為key必須可以被哈瞎⒚迹化,所以鍵或者鍵中的內容都是可不變的鱼响。
flights = dict([
(("Beijing", "Shanghai"), "21:15 PM"),
(("Shanghai", "Beijing"), "6:15 PM")])
flights["New"] = "Unknown"
flights[1] = "Hello"
print(flights)
結果為:
{('Beijing', 'Shanghai'): '21:15 PM', ('Shanghai', 'Beijing'): '6:15 PM', 'New': 'Unknown', 1: 'Hello'}
- 列表和字典的區(qū)別
列表 | 字典 | |
---|---|---|
順序 | 能保證存放順序 | 無序 |
訪問方法 | 索引 | key |
查找和插入速度 | 隨著元素的增加而增加 | 不會隨著key的增加而變慢跷敬, 速度恒定 |
占用空間 | 占用內存小 | 內存開銷稍大 |
常用方法
- in方法查詢字典中是否有該鍵
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
("Stephen Curry", "Golden State Warriors")])
name = "LeBron James"
# in方法檢索key,返回值為True或者False
if name in dict_nba:
print(name, "is an American professional basketball player for the", dict_nba[name] + ".")
else:
print("Not a NBA player.")
結果為:
LeBron James is an American professional basketball player for the Cleveland Cavaliers.
- get方法查詢字典中是否有該鍵
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
("Stephen Curry", "Golden State Warriors")])
name = "LeBron James"
# get方法檢索key热押,若存在直接返回該key對應的value
print(dict_nba.get(name))
# get方法檢索key,若不存在直接返回None
if dict_nba.get("Kevin Love"):
print(name, "is an American professional basketball player for the", dict_nba[name] + ".")
else:
print("Not a NBA player.")
# 或者可通過修改get(key, default = None)中的default值來指定默認返回值
print(dict_nba.get("Kevin Love", "Unknown."))
結果為:
Cleveland Cavaliers
Not a NBA player.
Unknown.
- pop斤寇,del方法刪除鍵值對
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
("Stephen Curry", "Golden State Warriors")])
# pop方法和get方法類似桶癣,也是pop(key, default = None)形式的
# 同樣的,若key存在娘锁,則從字典中刪除該key和value牙寞,并返回該key對應的value;若key不存在,返回default的值
print(dict_nba.pop("LeBron James"))
print(dict_nba)
# 已從表中刪除间雀,所以返回Unknown
print(dict_nba.pop("LeBron James", "Unknown."))
# del也可以從字典中刪除鍵值對悔详,并且無返回值
del dict_nba["James Harden"]
print(dict_nba)
結果為:
Cleveland Cavaliers
{'James Harden': 'Houston Rockets', 'Stephen Curry': 'Golden State Warriors'}
Unknown.
{'Stephen Curry': 'Golden State Warriors'}
- update方法更新字典
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
("Stephen Curry", "Golden State Warriors")])
# update方法,參數(shù)為字典惹挟,無返回值
# 也可用于修改value
temp = {"Dwight Howard": ["Orlando Magic", "Los Angeles Lakers", "Houston Rockets", "Atlanta Hawks", "Charlotte Hornets"],
"Kobe Bryant": "Retired",
"LeBron James": ["Miami Heat", "Cleveland Cavaliers"]}
dict_nba.update(temp)
print(dict_nba)
結果為:
{'LeBron James': ['Miami Heat', 'Cleveland Cavaliers'], 'James Harden': 'Houston Rockets', 'Stephen Curry': 'Golden State Warriors', 'Dwight Howard': ['Orlando Magic', 'Los Angeles Lakers', 'Houston Rockets', 'Atlanta Hawks', 'Charlotte Hornets'], 'Kobe Bryant': 'Retired'}