问答题
0. 当你听到小伙伴们在谈论“映射”、“哈希”、“散列”或者“关系数组”的时候,事实上他们就是在讨论什么呢?
答:字典。
2. 用方括号(“[]”)括起来的数据我们叫列表,那么使用大括号(“{}”)括起来的数据我们就叫字典,对吗?
答:不对。
>>> NotADict = {1, 2, 3, 4, 5}
>>> type(NotADict)
<class 'set'>
不难发现,虽然我们用大括号(“{}”)把一些数据括起来了,但由于没有反映出这些数据之间有映射的关系,所以创建出来的不是字典,而是叫’set’的东西,即集合。
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})
答:是的,他们都在创建字典:a = dict(one=1, two=2, three=3)。
0. Python的字典是否支持一键(Key)多值(Value)?
答:不支持,对相同的键再次赋值会将上一次的值直接覆盖。
>>> dict1 = {1:'one', 1:'yi'}
>>> dict1[1]
'yi'
1. 在字典中,如果试图为一个不存在的键(Key)赋值会怎样?
答:会自动创建对应的键(Key)并添加相应的值(Value)进去。
2*. 成员资格操作符(in和not in)可以检查一个元素是否存在序列中,当然也可以用来检查一个键(Key)是否存在字典中,那么请问哪种的检查效率更高些?为什么?
答:在字典中检查键(Key)是否存在比在序列中检查指定元素是否存在更高效。因为字典的原理是使用哈希算法存储,一步到位,不需要使用查找算法进行匹配,因此时间复杂度是O(1),效率非常高。
3*. Python对键(Key)和值(Value)有没有类型限制?
答:Python对键的要求相对要严格一些,要求它们必须是可哈希(Hash)的对象,不能是可变类型(包括变量、列表、字典本身等)。
但是Python对值是没有任何限制的,它们可以是任意的Python对象。
4. 请目测下边代码执行后,字典dict1的内容是什么?
>>> dict1.fromkeys((1, 2, 3), ('one', 'two', 'three'))
>>> dict1.fromkeys((1, 3), '数字')
答:执行完成后,字典dict1的内容是:{1: ‘数字’, 3: ‘数字’}
这里要注意的是,fromkeys方法是直接创建一个新的字典,不要试图使用它来修改一个原有的字典,因为它会直接把整个字典给覆盖掉。
5. 如果你需要将字典dict1 = {1: ‘one’, 2: ‘two’, 3: ‘three’}拷贝到dict2,你应该怎么做?
答:可以利用字典的copy()方法:dict2 = dict1.copy(),在其他语言转移到Python小伙伴们刚开始可能会习惯性的直接用赋值的方法(dict2 = dict1),这样子做在Python中只是将对象的引用拷贝过去而已。
>>> a = {1:'one', 2:'two', 3:'three'}
>>> b = a.copy()
>>> c = a
>>> c[4] = 'four'
>>> c
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>> a
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>> b
{1: 'one', 2: 'two', 3: 'three'}
动动手
0. 尝试利用字典的特性编写一个通讯录程序吧,功能如图:
答:代码如下:
print("""|---欢迎进入通讯录程序---|
|---1:查询联系人资料---|
|---2:插入新的联系人---|
|---3:删除已有联系人---|
|---4:退出通讯录程序---|""")
dict1={}
while True:
s1=int(input("\n请输入相关的指令代码: "))
if s1==1:
if len(dict1)==0:
print("通讯录为空,请插入新的联系人!")
else:
s2=input("请输入联系人姓名: ")
if s2 in dict1.keys(): #等价于 if s2 in dict1,in 在此处只检查字典的键值
print(s2,":",dict1[s2])
else:
print("您输入的姓名不在通讯录中!")
elif s1==2:
s3=input("请输入联系人姓名: ")
if s3 in dict1.keys():
print("您输入的姓名在通讯录中已存在-->>",s3,":",dict1[s3])
flag=input("是否修改用户资料(YES/NO)")
if flag=="YES":
s4=input("请输入用户联系电话: ")
dict1[s3]=s4
else:
continue
else:
s4=input("请输入用户联系电话: ")
dict1[s3]=s4
elif s1==3:
s5=input("请输入联系人姓名: ")
if s5 in dict1.keys():
del dict1[s5]
else:
print("您输入的姓名不在通讯录中!")
elif s1==4:
print("|---感谢进入通讯录程序---|")
break
else:
print("指令代码错误!")
【注】应养成写注释的习惯。
0. 尝试编写一个用户登录程序(这次尝试将功能封装成函数),程序实现如图: