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}