1. 程式人生 > 其它 >dict keys 取最後一個_第三章(第8節):dict型別

dict keys 取最後一個_第三章(第8節):dict型別

技術標籤: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 7293df2e606c98ea3dc3093f6265be2e.png