核心笔记:什么是哈希表?它们与字典的关系是什么?
序列类型用有序的数字键做索引将数据以数组的形式存储。一般,索引值与所存储的数据毫无
关系。还可以用另一种方式来存储数据:基于某种相关值,比如说一个字符串。我们在日常生活中
一直这么做。你把人们的电话号码按照他们的姓记录在电话簿上,你按照时间在日历或约会簿上添
加事件,等等。在这些例子中,你的键(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