BOO大全/雜湊
< BOO大全
雜湊(Hashes)
編輯雜湊表在其他語言也被稱作 dictonary、map、關聯陣列..等等。其行為很類似陣列,但索引值不限於數值,你可以使用任何物件,並且無固定長度。甚至有些語言根本就沒有所謂的陣列或串列,完全使用關聯陣列來取代 (例如 Javascript 和 AWK)。
>>> a = {} >>> a["one"] = 1 >>> a["two"] = 2 >>> a[1] = "one" >>> a["one"] 1 >>> a["two"] 2 >>> a.Count 3 >>> len(a) 3 >>> a {'two': 2, 1: 'one', 'one': 1}
在這個例子裡,有三個關聯的匹配值。key 用來作為索引值,以快速找到值,值並不需要指定型別(不過你最好還是使用相同的型別)。事實上,雜湊(hash)或雜湊表(hastable)並不是很恰當,這只強調了內部的實作使用了雜湊表,卻沒有表現出其介面特性,當然這對開發者來說不是很大的問題。Python 使用 dictionary,這會比較好些,因為使用上的確就如查找字典一般。
你可以將雜湊當作一般的陣列來用,但會缺乏效率。
>>>sqrs = {} >>>for i in range(1,10): ... sqrs[i] = i*i ... >>>sqrs {9: 81, 8: 64, 7: 49, 6: 36, 5: 25, 4: 16, 3: 9, 2: 4, 1: 1}
雖然效能很重要,但是正確要更重要,這是我要特別強調的一點。這個例子不建議使用雜湊的原因,是因為人們很直覺地期望這例子使用陣列﹔使用雜湊,會有大材小用的感覺。雜湊也很適合用在稀疏陣列上,因為稀疏陣列只有部份元素會被真正使用到,而不可能真的全部塞滿。
>>> sa = {} >>> sa[10] = true >>> sa[100] = true >>> sa.Count 2
雜湊也有屬性可以讓你存取鍵值、值:
>>>ages = {'june':42, 'alice':35, 'peter':28} >>>for name in ages.Keys: ... print name,ages[name] ... peter 28 alice 35 june 42
Keys屬性讓你可以迭代所有元素的鍵值。在迭代的時候,別期望會依照你想要的順序輸出,不像陣列或串列,雜湊並沒有所謂的順序(陣列或串列可以使用排序)。如果想要作排序的話,你可以參考下面的代碼,先利用Generator運算式做出陣列或串列,再來排序:
>>>ls = [n for n in ages.Keys] >>>ls.Sort() ['alice', 'june', 'peter'] >>>arr=array(int, ages[k] for k in ls) (35, 42, 28)
譯註:此範例有根據前面的文意作過修改,先把鍵值放到串列,排序之後,再依據排過序的鍵值去存取雜湊裡的值。
你也可以直接加入鍵值-值,和移除整個項目。對了,像這樣的語法:"ages['alice']=null" 並不會移除該項目,它只能使值變為 null (null 是一個很好的合法值)。
>>> ages.Add("mike",46) >>> ages.Remove("alice") >>> ages {'peter': 28, 'june': 42, 'mike': 46}