上一章:阵列与串列 目录 下一章:参考与物件


杂凑(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}

上一章:阵列与串列 目录 下一章:参考与物件