dict keys 取最後一個_第三章(第8節):dict型別
阿新 • • 發佈:2021-02-12
技術標籤:dict keys 取最後一個
假設我們需要用一個數據結構來儲存 3 萬個漢字,如果我們使用 list 或 tuple 來儲存,當我們查詢某個漢字時, 就需要從第一個成員開始一直找,直到我們能找到,或者到最後一個成員沒有找到為止。
dict 就是字典,其實現原理和我們使用的字典是一樣的,假設我們使用 dict 來儲存 3 萬個漢字,我們只需要在字典的索引表裡查這個漢字對應的位置,就可以找到這個字,無論找哪個字,我們都可以一次性定位到該字,也就是時間複雜度為 o(1)。 我們使用 dict 資料結構來儲存漢字,查詢速度不會隨著漢字內容的多少而變化。
對於我們前面學過的 str 型別,list 型別和 tuple 型別都可以通過下標訪問裡面的成員, 而 Python 的 dict 是無序的集合(無法通過下標訪問),但我們可以通過 dict 的鍵(key)來訪問,key 就類似於有序集合的下標。
dict 的定義
- dict 是 Python 內建的資料型別,在其它語言中一般屬於非內建型別,是由第三方庫或者程式設計師本身寫的庫, 比如 c++ 中的 stl 庫中的 map 和 Python 的 dict 類似,但實現方式不一樣(c++ 的 map 用的是紅黑樹,Python 用的是雜湊表),Python 語言用 {} 來表示是一個 dict,每個成員是一個鍵-值(key-value)配對。
student_dict = {"name": "ruhua", "age": 18}
print(student_dict)
- dict 成員在記憶體中的順序和定義時候的順序不一定一樣,這是由建立雜湊表的演算法(大家可自行搜尋雜湊表演算法) 決定的,雜湊表的演算法決定鍵的存放位置。
student_dict = {'a': 1, 'b': 2, 'c': 3}
print(student_dict) # 記憶體中順序為 {'a': 1, 'c': 3, 'b': 2}
dict 的增刪改查
- 我們知道 dict 是無序的,所以無法通過下標訪問值,但我們可以通過 key 來訪問該 key 對應的值, 訪問方式為 dict[key],但要確保 key 存在,不然會報異常;我們也可以使用 dict 的 get 函式獲取 key 對應的值,如果 key 不存在,則返回 None。
mydict = {'a': 1, 'b': 2, 'c': 3} print(mydict['b']) print(mydict.get('b')) print(mydict['d']) # 報異常 print(mydict.get('d')) # 返回 None
- 我們如果想給字典新增一個值,可以直接通過
dict[key] = value
的方式,如果 key 已經存在的話,則是修改。
mydict = {'a': 1, 'b': 2, 'c': 3}
mydict['d'] = 4
mydict['b'] = 5
print(mydict)
- 因為 dict 的每個成員都是鍵值配對,所以刪除成員的時候,通過鍵刪除值,整個成員就會刪除掉, 可以使用 Python 內建函式 del 或 dict 成員函式 pop 做刪除操作,注意要確保刪除的鍵存在,不然會報異常。
mydict = {'a': 1, 'b': 2, 'c': 3}
del mydict['b']
print(mydict)
mydict.pop('a')
print(mydict)
獲取 dict 鍵,值,成員的函式
- dict 的 keys 函式獲取 dict 所有成員的鍵放在一個 dict_keys 型別的物件中,這個物件是一個可遍歷的集合,我們可以通過遍歷這個物件,獲取每一個鍵。
mydict = {'a': 1, 'b': 2, 'c': 3}
allkeys = mydict.keys()
print(allkeys)
print(type(allkeys))
for key in allkeys:
print(key)
- dict 的 values 函式獲取 dict 所有值放在一個 dict_values 型別的物件中,這個物件是一個可遍歷的集合,我們可以通過遍歷這個物件,獲取每一個值。
mydict = {'a': 1, 'b': 2, 'c': 3}
allvalues = mydict.values()
print(allvalues)
print(type(allvalues))
for value in allvalues:
print(value)
- dict 的 items 函式獲取 dict 所有的成員放在一個 dict_items 型別的物件中,這個物件是一個可遍歷的集合,我們可以通過遍歷這個物件,獲取每一個成員。
mydict = {'a': 1, 'b': 2, 'c': 3}
allitems = mydict.items()
print(allitems)
print(type(allitems))
for item in allitems:
print(item)
- 注意:在 Python 2 中,dict 還提供了 iter 系列函式(iter_keys 函式,iter_values 函式,iter_items 函式)來獲取 dict 的鍵,值和成員,並把他們放入迭代器中;而 Python2 的 keys 函式,values 函式和 items 函式則把取出的值放在一個 list 中。
使用 dict 注意事項
- dict 的鍵就如有序集合的索引一樣,dict 成員的鍵是不可以修改的。
- dict 成員的鍵就像索引一樣是不可以重複的。
mydict = {'a': 1, 'b': 2, 'c': 3}
mydict['b'] = 4 # 只會修改鍵所對應的值
print(mydict)
- 因為 Python 的 dict 資料結構是採用 hash 演算法構建的,hash 演算法決定 key 的位置, 所以 dict 成員的鍵是必須可以 hash 的,所有的常量都是可 hash 的,比如數字,字串,bool值,None 等等, 對於 tuple 來說,如果 tuple 的成員也都是可 hash 的則可以,否則不行。
mydict = {} # 空的 dict
mydict[-1.1] = "Hello" # 數字
mydict["babye"] = "babye" # 字串
mydict[False] = "welcome" # bool 值
mydict[None] = "Python"
mydict[(1, (2, 3))] = "老鳥python" # 可雜湊的 tuple
mydict[[1, 2]] = "my god" # [1, 2] 不可 hash
mydict[{'a': 1}] = "my god" # {'a': 1} 不可 hash
mydict[(1, (2, [3,4]))] # (1, (2, [3,4]) 不可 hash
- 對 dict 成員的 key 進行增加,刪除操作時,dict 的 hash 表的結構就會改變, 成員的儲存順序就會發生變化,在遍歷的時候就會出現混亂,因為已經遍歷過的成員有可能再次被遍歷等等(在迴圈章節我們再講這個問題)。
本節重要知識點
- dict 內部儲存的資料結構。
- 熟練使用 dict 增刪改查
- 熟練使用獲取 key,value 和 成員的函式。
作業
建一個字典結構的 students_dict 用來儲存班級裡同學的資訊,students_dict 的成員分別為:姓名,性別,年齡, 是否單身以及父母名字(注意父母名字是 students_dict 的一個成員)。
閱讀原文:
dict型別www.birdpython.com