============ CH25 homework ============
本章主要介绍了dict, dict(mapping)
0 当你听到小伙伴在讨论 “映射”、”哈希”、”散列” 或者 “关系数组” 的时候,
事实上他们就是在讨论什么呢?
Answer: 先来看这几个关键词的意思是什么
映射:
两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,
就这种对应为从A到B的映射,记作f:A→B。其中,b称为元素a在映射f下的象,记作:b=f(a)。
a称为b关于映射f的原象。集合A中所有元素的象的集合称为映射f的值域,记作f(A)。
哈希:
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),
通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间
通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单
的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
散列:
通过将单向数学函数(有时称为散列算法)应用到任意数量的数据所得到的固定大小的结果。假如输入数据中发
生更改,则消息摘要的结果值也将更改。消息摘要也被称为散列。关联数组是这样的数组,它的每个数据元素与
一个键相对配对,该键用于识别数据元素。由于散列函数用来创建关联数组中的指定元素,并在关联数组中查找
指定元素,因此关联数组通常称为散列。
存储地址=Hash (关键码) Hash-散列函数
所谓散列就是通过吧关键码值映射到表中的一个位置来访问记录的过程。大多数散列方法根据地址计算需要的顺
序把记录放到表中,这样就不用根据值或者频率的顺序放置记录了
总结: 实际上讨论的是字典!
1 尝试一下将数据(‘F’:70, ‘C’:67, ‘h’:104, ‘i’:105, ‘s’:115)创建为一个字典并访问键’C’对
应的值?
Answer:
dict1 = {'F':70, 'C':67, 'h':104, 'i':105, 's':115}
dict2 = dict((('F',70), ('C', 67), ('h', 104), ('i', 105), ('s', 115)))
dict1['C']
dict2['C']
2 用方括号(“[]”)括起来的数据叫列表,那么用大括号(“{}”)括起来的就叫字典,对吗?
Answer: 不对,字典需要关键字和值,大括号不一定同时满足这两者。也就是一定要包含映射关系
3 你如何理解有些东西字典做得到,但万能的列表却难以实现?
Answer: 比如两个列表中的值并不是顺序上一一对应,用列表查询时会造成极其的不便
4 下边这些代码,他们在执行一样的操作吗?你看的出差别吗?
a = dict(one = 1, two = 2, three = 3)
b = {'one':1, 'two':2, 'three':3}
c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
d = dict([('two', 2), ('one', 1), ('three', 3)])
e = dict({'three':3, 'one':1, 'two':2})
Answer: 无差别,都是一样的字典,都满足字典的要求
实测:
>>> a['one']
1
>>> b['one']
1
>>> c['one']
1
>>> d['one']
1
>>> e['one']
1
5 如图,你可以推测出打了马赛克部分的代码吗?
data = '1000, 小甲鱼, 男'
MyDict = {}
(MyDict['id'], MyDict['name'], MyDict['sex']) = xxxxx
print("ID: " + MyDict['id'])
print("Name: " + MyDict['name'])
print("Sex: " + MyDict['sex'])
# Result
ID: 1000
Name: 小甲鱼
Sex: 男
Answer:
粗暴方案: (1000, 小甲鱼, 男)
高级方案: data.split(‘,’)
Practice
0 尝试利用字典的特性编写一个通讯录程序吧!
# 分析
# 通讯录内容包含: 姓名, 电话, Email, 地址.....
# 通讯录功能包含: 查询, 新增, 删除
# 系统功能: 退出
print('|========欢迎进入通讯录========|')
print('|========1: 查询联系人========|')
print('|========2: 添加联系人========|')
print('|========3: 删除联系人========|')
print('|========4: 退出通讯录========|')
contacts = dict()
while 1:
instr = int(input('\n请输入相关的操作指令: '))
if instr == 1:
name = input('请输入联系人姓名: ')
if name in contacts:
print(name + ':' + contacts[name])
else:
print('查询的姓名不在通讯录中!')
if instr == 2:
name = input('请输入新增联系人姓名: ')
if name in contacts:
print('该联系人已在通讯录中 -->>', end = ' ')
print(name + ':' + contacts[name])
if input('是否修改用户资料(Yes/No)') == 'Yes':
contacts[name] = input('请输入用户联系电话: ')
else:
contacts[name] = input('请输入用户联系电话: ')
if instr == 3:
name = input('请输入联系人姓名: ')
if name in contacts:
del contacts[name]
else:
print('你输入的联系人不在通讯录中!')
if instr == 4:
break
print('|========感谢使用通讯录========|')
#Test
|========欢迎进入通讯录========|
|========1: 查询联系人========|
|========2: 添加联系人========|
|========3: 删除联系人========|
|========4: 退出通讯录========|
请输入相关的操作指令: 2
请输入新增联系人姓名: 笑笑
请输入用户联系电话: 18800475886
请输入相关的操作指令: 2
请输入新增联系人姓名: 李宁
请输入用户联系电话: 13265723459
请输入相关的操作指令: 2
请输入新增联系人姓名: 洋洋
请输入用户联系电话: 18990765438
请输入相关的操作指令: 1
请输入联系人姓名: 笑笑
笑笑:18800475886
请输入相关的操作指令: 1
请输入联系人姓名: 李宁
李宁:13265723459
请输入相关的操作指令: 3
请输入联系人姓名: 笑笑
请输入相关的操作指令: 1
请输入联系人姓名: 笑笑
查询的姓名不在通讯录中!
请输入相关的操作指令: 4
|========感谢使用通讯录========|