dictPython內置了字典:dict的支持,,dict全稱dictionary,在其他語言中也稱為map,,使用鍵-值(key-value)存儲,,具有極快的查找速度。 舉個例子,,假設要根據(jù)同學的名字查找對應的成績,,如果用list實現(xiàn),需要兩個list:
給定一個名字,,要查找對應的成績,,就先要在names中找到對應的位置,,再從scores取出對應的成績,list越長,,耗時越長,。 如果用dict實現(xiàn),只需要一個“名字”-“成績”的對照表,,直接根據(jù)名字查找成績,,無論這個表有多大,查找速度都不會變慢,。用Python寫一個dict如下:
為什么dict查找速度這么快,?因為dict的實現(xiàn)原理和查字典是一樣的。假設字典包含了1萬個漢字,,我們要查某一個字,,一個辦法是把字典從第一頁往后翻,直到找到我們想要的字為止,,這種方法就是在list中查找元素的方法,,list越大,查找越慢,。 第二種方法是先在字典的索引表里(比如部首表)查這個字對應的頁碼,,然后直接翻到該頁,找到這個字,,無論找哪個字,,這種查找速度都非常快,,不會隨著字典大小的增加而變慢,。 dict就是第二種實現(xiàn)方式,給定一個名字,,比如 你可以猜到,,這種key-value存儲方式,在放進去的時候,,必須根據(jù)key算出value的存放位置,,這樣,取的時候才能根據(jù)key直接拿到value,。 把數(shù)據(jù)放入dict的方法,,除了初始化時指定外,,還可以通過key放入:
由于一個key只能對應一個value,所以,,多次對一個key放入value,,后面的值會把前面的值沖掉:
如果key不存在,dict就會報錯:
要避免key不存在的錯誤,,有兩種辦法,,一是通過
二是通過dict提供的get方法,如果key不存在,,可以返回None,,或者自己指定的value:
注意:返回None的時候Python的交互式命令行不顯示結果。 要刪除一個key,,用
請務必注意,dict內部存放的順序和key放入的順序是沒有關系的,。 和list比較,,dict有以下幾個特點:
而list相反:
所以,,dict是用空間來換取時間的一種方法。 dict可以用在需要高速查找的很多地方,,在Python代碼中幾乎無處不在,,正確使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變對象,。 這是因為dict根據(jù)key來計算value的存儲位置,,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了,。這個通過key計算位置的算法稱為哈希算法(Hash),。 要保證hash的正確性,作為key的對象就不能變,。在Python中,,字符串、整數(shù)等都是不可變的,,因此,,可以放心地作為key,。而list是可變的,就不能作為key:
setset和dict類似,,也是一組key的集合,,但不存儲value。由于key不能重復,,所以,,在set中,沒有重復的key,。 要創(chuàng)建一個set,,需要提供一個list作為輸入集合:
注意,傳入的參數(shù) 重復元素在set中自動被過濾:
通過
通過
set可以看成數(shù)學意義上的無序和無重復元素的集合,,因此,兩個set可以做數(shù)學意義上的交集,、并集等操作:
set和dict的唯一區(qū)別僅在于沒有存儲對應的value,,但是,set的原理和dict一樣,,所以,,同樣不可以放入可變對象,,因為無法判斷兩個可變對象是否相等,,也就無法保證set內部“不會有重復元素”。試試把list放入set,,看看是否會報錯,。 再議不可變對象上面我們講了,str是不變對象,,而list是可變對象,。 對于可變對象,比如list,,對list進行操作,,list內部的內容是會變化的,比如:
而對于不可變對象,,比如str,,對str進行操作呢:
雖然字符串有個 我們先把代碼改成下面這樣:
要始終牢記的是, 當我們調用 所以,,對于不變對象來說,調用對象自身的任意方法,,也不會改變該對象自身的內容,。相反,這些方法會創(chuàng)建新的對象并返回,,這樣,,就保證了不可變對象本身永遠是不可變的。 小結使用key-value存儲結構的dict在Python中非常有用,,選擇不可變對象作為key很重要,最常用的key是字符串,。 tuple雖然是不變對象,,但試試把 |
|