跳转到内容

BOO大全/雜湊

维基教科书,自由的教学读本
(重定向自BOO/BooHashes

上一章:陣列與串列 目錄 下一章:參考與物件


雜湊(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}

上一章:陣列與串列 目錄 下一章:參考與物件