问答题


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: ‘数字’}

python给字典赋值_赋值


这里要注意的是,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. 尝试利用字典的特性编写一个通讯录程序吧,功能如图:

python给字典赋值_IDLE_02


答:代码如下:

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. 尝试编写一个用户登录程序(这次尝试将功能封装成函数),程序实现如图:

python给字典赋值_python_03