核心笔记:什么是哈希表?它们与字典的关系是什么?
序列类型用有序的数字键做索引将数据以数组的形式存储。一般,索引值与所存储的数据毫无
关系。还可以用另一种方式来存储数据:基于某种相关值,比如说一个字符串。我们在日常生活中
一直这么做。你把人们的电话号码按照他们的姓记录在电话簿上,你按照时间在日历或约会簿上添
加事件,等等。在这些例子中,你的键(key)就是和数据项相关的值。
哈希表是一种数据结构:它按照我们所要求的去工作。哈希表中存储的每一条数据,叫做一个
值(value),是根据与它相关的一个被称作为键(key)的数据项进行存储的。键和值合在一起被称为
“键-值 对”(key-value pairs)。 哈希表的算法是获取键,对键执行一个叫做哈希函数的操作,
并根据计算的结果,选择在数据结构的某个地址中来存储你的值。任何一个值存储的地址皆取决于
它的键。正因为这种随意性,哈希表中的值是没有顺序的。你拥有的是一个无序的数据集。
你所能获得的有序集合只能是字典中的键的集合或者值的集合。方法 Keys() 或 values() 返回
一个列表,该列表是可排序的。 你还可以用 items()方法得到包含键、值对的元组的列表来排序。
由于字典本身是哈希的,所以是无序的。
哈希表一般有很好的性能, 因为用键查询相当快。
7-1
"""字典方法。哪个字典方法可以用来把两个字典合并到一起?""" """ Answer: (1) items(...) | D.items() -> list of D's (key, value) pairs, as 2-tuples (2) update(...) | D.update([E, ]**F) -> None. Update D from dict/iterable E and F. | If E present and has a .keys() method, does: for k in E: D[k] = E[k] | If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v | In either case, this is followed by: for k in F: D[k] = F[k] """ (1) >>> new = dict([ ("qwer"[i-1], i) for i in range(1, 5) ]) >>> new {'q': 1, 'r': 4, 'e': 3, 'w': 2} >>> old = dict([ ("asdf"[i-1], i) for i in range(1, 5) ]) >>> old {'a': 1, 's': 2, 'd': 3, 'f': 4} >>> res_add = dict( new.items() + old.items() ) >>> res_add {'a': 1, 'e': 3, 'd': 3, 'f': 4, 'q': 1, 's': 2, 'r': 4, 'w': 2} (2) >>> new.update(old) >>> new {'a': 1, 'e': 3, 'd': 3, 'f': 4, 'q': 1, 's': 2, 'r': 4, 'w': 2}
7-2.
字典的键。我们知道字典的值可以是任意的 Python 对象,那字典的键又如何呢?请试
着将除数字和字符串以外的其他不同类型的对象作为字典的键,看一看,哪些类型可以,哪些不行?
对那些不能作字典的键的对象类型,你认为是什么原因呢?
Answer:
Python 的字典是作为可变的哈希表实现的,在执行中字典中的键不允许被改变。
比如:当创建了一个字典,字典中包含一个元素(一个键和一个值)。可能是由于某个变量的改变导致键发生了改变。这时候用原来的键来取出字典的数据,会得到KeyError(因为键的值已经改变了),现在没办法从字典中获取该值啦,因为键本身的值发生了变化。由于字典中的键必须是可哈希的,所以数字和字符串可以作为字典中的键,但是列表和其他字典不行。
( 1 )字典的键不允许一个键对应多个值,如果对应多个值,则取最后一个。
( 2 )键必须是可哈希的。
( 3 )如果用元祖做有效的键,必须加以限制:元祖中只包含像数字和字符串这样的不可变参数,才可以作为字典中有效的 键。
7-3.
#!/usr/bin/env python # coding: utf-8 # author: toddlerya # date: Jan 18 2015 """ 7–3. 字典和列表的方法。 (a) 创建一个字典,并把这个字典中的键按照字母顺序显示出来。 (b) 现在根据已按照字母顺序排序好的键,显示出这个字典中的键和值。 (c)同(b),但这次是根据已按照字母顺序排序好的字典的值,显示出这个字典中的键和值。(注 意:对字典和哈希表来说,这样做一般没有什么实际意义,因为大多数访问和排序(如果需要)都是 基于字典的键,这里只把它作为一个练习。) """ # (a) and (b) print '-----------(a) and (b)-----------' dict1 = {'a': 'w', 'c': 'v', 'e': 'y', 'b': 'x', 'd': 'z'} for j in sorted(dict1): print "tht key is ", j, "and the value is ", dict1[j] # (c) print '----------------(c)--------------\n' for value in sorted(dict1.values()): for key in dict1.keys(): if dict1[key] == value: print "The key is", key, "The value is", value
/usr/bin/python2.7 /home/toddler/Documents/learn_python/python_core_pragrams/Chapter_7/7-3.py -----------(a) and (b)----------- tht key is a and the value is w tht key is b and the value is x tht key is c and the value is v tht key is d and the value is z tht key is e and the value is y ----------------(c)-------------- The key is c The value is v The key is a The value is w The key is b The value is x The key is e The value is y The key is d The value is z Process finished with exit code 0
7-4.
#!/usr/bin/env python # coding: utf-8 # author: toddlerya # date: Jan 18 2015 """ 7-4. 建立字典。给定两个长度相同的列表,比如说, 列表[1, 2, 3,...]和['abc', 'def','ghi',...], 用这两个列表里的所有数据组成一个字典,像这样:{1:'abc', 2: 'def', 3: 'ghi',...} """ list1 = [1, 2, 3, 4, 5] list2 = ['abc', 'def', 'ghi', 'jkl', 'mno'] dict1 = dict([(list1[int(i-1)], list2[i-1]) for i in list1]) print dict1