零基础学Python(25)

 

字典

映射:

dict={key:value}

操作符:

  1. fromkeys (iterable, value=None, /) from builtins.type Returns a new dict with keys from iterable and values equal to value.
     >>> dict1.fromkeys((1,2,3))
     {1: None, 2: None, 3: None}
     >>> dict1.fromkeys((1,2,3),'number')
     {1: 'number', 2: 'number', 3: 'number'}
    
  2. keys()

    >>> for eachkey in dict1.keys():
     	print(eachkey)#打印每个key的值
    
  3. values()

    >>> for eachvalue in dict1.values():
    	print(eachvalue)#打印每个value的值
    
  4. items()

     for eachItem in dict.items():
    	print(eachItem)#打印每个字典映射组
    
  5. get()

       >>> dict1.get(32,'木有')
       '木有'
       >>> dict1.get(31)
       '赞'
    
  6. 成员资格操作符in/not in

    >>> dict1
    {0: '赞', 1: '赞', 2: '赞', 3: '赞', 4: '赞', 5: '赞', 6: '赞', 7: '赞', 8: '赞', 9: '赞', 10: '赞', 11: '赞', 12: '赞', 13: '赞', 14: '赞', 15: '赞', 16: '赞', 17: '赞', 18: '赞', 19: '赞', 20: '赞', 21: '赞', 22: '赞', 23: '赞', 24: '赞', 25: '赞', 26: '赞', 27: '赞', 28: '赞', 29: '赞', 30: '赞', 31: '赞'}
    >>> 32 in dict1
    False
    >>> 31 in dict1
    True
    
  7. clear

    >>> dict1.clear()
    >>> dict1
    {}
    
  8. copy()

    >>> a = {1:'one',2:'two',3:'three'}
       >>> b = a.copy() #前拷贝,后续操作无关
       >>> c = a
       >>> c[4] = 'four'
       >>> c
       {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
       >>> b
       {1: 'one', 2: 'two', 3: 'three'}
       >>> a
    
       {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
    
  9. pop()/popitem()

     >>> a
       {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
       >>> a.pop(2)#甩出后,就不再存储于字典中
       'two'
       >>> a.popitem()
       (4, 'four')
       >>> a.popitem()
       (3, 'three')
       >>> a.popitem(2)
       Traceback (most recent call last):
         File "<pyshell#66>", line 1, in <module>
           a.popitem(2)
       TypeError: popitem() takes no arguments (1 given)
    
  10. setdefault

    >>> b.setdefault('小白') #输入一个默认item
    >>> b
    {1: 'one', 2: 'two', 3: 'three', '小白': None}
    >>> b.setdefault(4,'four')
    'four'
    >>> b
    {1: 'one', 2: 'two', 3: 'three', '小白': None, 4: 'four'}
    >>> b.setdefault('猪婆')
    >>> b
    {1: 'one', 2: 'two', 3: 'three', '小白': None, 4: 'four', '猪婆': None}
    
  11. update

    >>> c ={'小白':'狗'}
    >>> b
    {1: 'one', 2: 'two', 3: 'three', '小白': None, 4: 'four', '猪婆': None}
    >>> b.update(c)
    >>> b
    {1: 'one', 2: 'two', 3: 'three', '小白': '狗', 4: 'four', '猪婆': None}
    

第25课课后作业

  1. 尝试将数据(‘F’:70,’C’:67,’h’:104,’i’:105,’s’:115)创建为一个字典并访问键‘C’对应的值。

    答案:

     >>> lis = (('F',70),('C',67),('h',104),('i',105),('s',115))
     >>> dic = dict(lis)
     >>> dic
     {'F': 70, 'C': 67, 'h': 104, 'i': 105, 's': 115}
     >>> dic['C']
     67
    
  2. []括起来的数据我们叫列表,那么用{}括起来的数据就叫字典,对吗?

    答案:

    不对。下图所示,没有映射的数据不是字典,而叫set集合。

    >>> notadict = {1,2,3,4,5}
     >>> type(notadict)
     <class 'set'>
    
  3. 如何理解有些东西字典做得到,但“万能的”列表却难以实现?

    答案:

    >>> brand = ['李宁','耐克','阿迪达斯']
       >>> slogan = ['一切皆有可能','just do it','阿迪达斯']
       >>> print('李宁口号是:', slogan[brand.index('李宁')])
       李宁口号是 一切皆有可能
          
       >>> dict ={brand[1]:slogan[1]}
       >>> dict
       {'耐克': 'just do it'}
    
  4. 下面这些代码,它们执行一样的操作吗?你看得出差别吗?

    >>> c = dict(zip(['one','two','three'],[1,2,3]))
    >>> c
    {'one': 1, 'two': 2, 'three': 3}
    >>> a = dict(one=1,two=2, three=3)
    >>> a
    {'one': 1, 'two': 2, 'three': 3}
    >>> b = {'one':1,'two':2,'three':3}
    >>> b
    {'one': 1, 'two': 2, 'three': 3}
    >>> d = dict([('two',2),('one',1),('three',3)])
    >>> d
    {'two': 2, 'one': 1, 'three': 3}
    >>> e = dict({'three':3,'one':1,'two':2})
    >>> e
    {'three': 3, 'one': 1, 'two': 2}
    

    答案:

    是的,他们都在创建字典,如上图所示。

  5. 如图,你可推测出打了马赛克部分的代码吗?

    mark

    答案:

    data = "1000,小甲鱼,男"
    MyDict = {}
       
    (MyDict['id'],MyDict['name'],MyDict['sex']) = ("1000","小甲鱼","男")
       
    print("ID:  " + MyDict['id'])
    print("Name:  " + MyDict['name'])
    print("Sex   "+ MyDict['sex'])
    
  6. mark

    答案:

 print('|---欢迎进入通讯录程序---|')
 print('|---1:查询联系人资料---|')
 print('|---2:插入新的联系人---|')
 print('|---3:删除已有联系人---|')
 print('|---4:退出通讯录程序---|')

 
contacts = dict({"李亚星":185806930, "周阳":199718154})

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 ('您输入的姓名已存在')
            print (name + ':' ,contacts(name))
        else:
            num = input('请输入联系人号码:')
            contacts.update({name : num})
            
    if instr == 3:
        name = input('请输入需要删除的联系人:')
        if name not in contacts:
            print ('您输入的姓名不存在')
        else:
            contacts.pop(name)
            
    if instr == 4:
        print('感谢您的查询,再见')
        break

第26课课后作业

  1. Python的字典是否支持一键(Key)多值(Value)?

    答案:

    不支持,对相同的键再次赋值会讲上次的值直接覆盖。

    >>> dic1 = {1:'one', 1:'yi'}
    >>> dic1[1]
    'yi'
    
  2. 在字典中,如果试图为一个不存在的键(Key)赋值会怎么样?

    答案:

    >>> dic1 = {1:'one', 2:'two'}
    >>> dic1[3]
    Traceback (most recent call last):
      File "<pyshell#6>", line 1, in <module>
        dic1[3]
    KeyError: 3
    >>> dic1[3] = 'three' #自动创建对应的Key和对应的Value
    >>> dic1
    {1: 'one', 2: 'two', 3: 'three'}
    
  3. 成员资格操作符(in和not in)可以检查一个元素是否存在在序列中,当然也可以用来检验一个键(Key)是否存在字典中,那么哪种检查效率更高些呢?为什么?

    答案:

    在字典中检查Key效率更高,因为字典的原理是使用哈希算法存储,一步到位,不用使用查找算法进行匹配。

  4. Python对键(Key)和值(Value)有没有类型限制?

    答案:

    Python对键的要求严格一些,必须是可哈希的对象,不能死可变类型(变量,列表,字典本身)。

    但是对值没有任何限制,可以使任意的python对象。

    参考:https://fishc.com.cn/forum.php?mod=viewthread&tid=45016&extra=page%3D1&page=1

  5. 目测以下代码执行后,字典dict1的内容是什么?

    mark

    答案:

    >>> dic1.fromkeys((1,2,3),('one','two','three'))
    {1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
    >>> dic1.fromkeys((1,3),'数字')
    {1: '数字', 3: '数字'}
    >>> dic1
    {1: 'one', 2: 'two', 3: 'three'}
    

    注意:fromkeys方法是直接创建新的字典,不会把整个字典覆盖掉。

  6. 如果你需要将字典dict1 = {1:’one’, 2:’two’, 3:’three’}拷贝到dict2,你应该怎么做?

    答案:

    利用copy()方法dict2=dict1.copy(),直接赋值方法(dict2 =dict1)只是将对象引用拷贝过去而已。如图所示:

    >>> a = {1:'one',2:'two',3:'three'}
    >>> b = a.copy() #前拷贝,后续操作无关
    >>> c = a
    >>> c[4] = 'four'
    >>> c
    {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
    >>> b
    {1: 'one', 2: 'two', 3: 'three'}
    >>> a
    {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
    
  7. 尝试编写一个用户登录程序(这次尝试将功能封装成函数),程序实现如下图:

    mark

    答案:

    print('|---新建用户:N/n---|')
    print('|---登录账号:E/e---|')
    print('|---退出程序:Q/q---|')
       
    while True:
           
        choice = input('|---请输入指令代码:')
        pro = dict({'李亚星':123, '周阳':778})
       
        if choice == 'N' or choice == 'n':
            prompt = '请输入用户名:'
            while True:
                key = input(prompt)
                if key in pro:
                    prompt = '此用户名已经被使用,请重新输入:'
                    continue
                else:
                    break
            value = input('请输入密码:')
            pro[key] = value
            print('注册成功,赶紧登录吧')
           
       
        if choice == 'E' or choice == 'e':
            prompt = '请输入用户名:'
            while True:
                key = input(prompt)
                if key not in pro:
                    prompt = '此用户名不存在,请重新输入:'
                    continue
                else:
                    break
                           
            value = input('请输入密码:')
            pd = pro.get(key)
               
            if value == pd:
                print('欢迎进入我的世界!')
            else:
                print('密码错误')
        continue
       
        if choice == 'Q' or choice == 'q':
            print('再见')