欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python基础数据类型:字典dict

程序员文章站 2022-03-20 20:24:59
Python基础数据类型:字典dict 01 内容大纲 字典的初识 字典的使用(增删改查) 字典的嵌套 02 具体内容 字典的初识: why: 列表可以存储大量的数据,数据之间的关联性不强 ['太白', 18, '男', '大壮', 3, '男'] 列表的查询速度比较慢。 what:容器型数据类型: ......

python基础数据类型:字典dict

01 内容大纲

  • 字典的初识
  • 字典的使用(增删改查)
  • 字典的嵌套

02 具体内容

  • 字典的初识:

    • why:

      • 列表可以存储大量的数据,数据之间的关联性不强
        • ['太白', 18, '男', '大壮', 3, '男']
      • 列表的查询速度比较慢。
    • what:容器型数据类型:dict。

    • how:

      • 数据类型的分类(可变与不可变)

        • 可变(不可哈希)的数据类型:list dict set

        • 不可变(可哈希)的数据类型: str bool int tuple

          • 不可变是指该对象本身是不可变的,在内存中自始至终未变化。

            • 比如,对字符串的任何操作,对原对象没有任何改变。

              s = 'alex'
              s2 = s.upper()
              print(s,s2)#alex alex
              
              s = 'alex'
              s = s.upper()
              print(s)#alex   变化的只是变量的指向
            • i = 100
              i = 101
              i = 102   #100,101,102都会在内存中占一定空间,变化的只是变量的指向。
      • 字典:{}括起来,以键值对形式存储的容器型数据类型:

        • dic = {'太白':
               {'name': '太白金星','age': 18, 'sex': '男'},
           'python22期': 
               ['朱光亚', '大壮', '雪飞', '岑哥'],
           }
      • 键必须是不可变的数据类型:int , str (bool tuple几乎不用) 键要是唯一的

      • 只能通过房间号(键)找到房间(值),房间内存什么数据都行

      • 值可以是任意数据类型,对象。

      • 字典3.5x版本之前(包括3.5)是无序的。

      • 字典3.6x会按照初次建立字典的顺序排列,学术上不认为是有序的。

      • 字典3.7x以后都是有序的。

      • 字典的优点:查询速度非常快,存储关联性的数据。

      • 字典的缺点:以空间换时间。

    • 字典的创建方式:

      • 面试会考:创建字典的三种方式
        #dict查看源码  ctrl+左键 点击dict
        # 方式一:
         dic = dict((('one', 1), ('two', 2), ('three', 3)))  #创建字典用dic = dic()  括号内包含一个大元组,用括号括起来,
                                                             #大元组内部包含三个小元组,分别用3个括号括起来。用到了元组的拆包
         dic = dict([('one',1),('two',2),('three',3)])
         print(dic)  # {'one': 1, 'two': 2, 'three': 3}
        
        # 方式二:
         dic = dict(one=1, two=2, three=3)
         print(dic)
        
        # 方式三:
         dic = dict({'one': 1, 'two': 2, 'three': 3})    #官方正规写法dic = dic()  括号内放了一个字典
         print(dic)
        
         dic = {'one': 1, 'two': 2, 'three': 3}  #平时上课的写法
        
        # 方式四:
         dic = dict(zip(['one', 'two', 'three'],[1, 2, 3]))
         print(dic)#{'one': 1, 'two': 2, 'three': 3}
        
        # 方式五: 字典推导式 后面会讲到
         dic = { k: v for k,v in [('one', 1),('two', 2),('three', 3)]}
         print(dic)#{'one': 1, 'two': 2, 'three': 3}
        
        # 方式六:利用fromkey
         dic = dict.fromkeys('abcd','太白')
         print(dic)#{'a': '太白', 'b': '太白', 'c': '太白', 'd': '太白'}
    • 验证字典的合法性:

      # 不合法
      dic = {[1,2,3]: 'alex', 1: 666}  # 键要不可变的数据类型
      print(dic)    #typeerror: unhashable type: 'list'
      dic = {[1, 2, 3]: '周杰伦'} # list是可变的. 不能作为key。typeerror: unhashable type: 'list'
      dic = {{1: 2}: "哈哈哈"} # dict是可变的. 不能作为key。typeerror: unhashable type: 'dict'
      dic = {{1, 2, 3}: '呵呵呵'} # set是可变的, 不能作为key。typeerror: unhashable type: 'set'
      
      dic = {1: 'alex', 1: '太白', 2: 'wusir'}  # 键要唯一
      print(dic)  #{1: '太白', 2: 'wusir'}
    • 字典的增删改查【掌握】

      dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']}
      # 增:
      # 直接增加 有则改之,无则增加
       dic['sex'] = '男'  #没有sex这个键,就增加键值对
       print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车'], 'sex': '男'}
      
       dic['age'] = 23  # 改 :有age这个键,就成了字典的改值
       print(dic)#{'name': '太白', 'age': 23, 'hobby_list': ['直男', '钢管', '开车']}
      
      # setdefault  有则不变,无则增加
      dic.setdefault('hobby')
      print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车'], 'hobby': none}     #none空
      
      dic.setdefault('hobby', '球类运动')#无则增加:没有此键则添加
      print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车'], 'hobby': '球类运动'}
      
      dic.setdefault('age', 45)#有则不变:有此键则不变
      print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']}
      
      
      # 删
      # pop 按照键删除键值对, 有返回值,可以设置返回值;设置第二个参数则无论字典中有无此键都不会报错   ***【重点记】
       dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']}
       dic.pop('age')
       print(dic)#{'name': '太白', 'hobby_list': ['直男', '钢管', '开车']}
       ret = dic.pop('age')
       print(ret)  #18  返回删除键对应的值
      
       dic.pop('hobby') #报错 keyerror: 'hobby'
      
       #设置第二个参数则无论字典中有无此键都不会报错 ;pop返回值可以设置   
       ret = dic.pop('hobby','没有此键')  
       print(ret)#没有此键  
       ret = dic.pop('hobby','哈哈')
       print(ret)#哈哈  (返回值)
      
      
      # popitem 3.5版本之前,popitem为随机删除,3.6之后为删除最后一个,有返回值
       dic = {'name': '太白', 'age': 18}
       ret = dic.popitem()
       print(ret, dic) #('age', 18) {'name': '太白'}
      
      
      # clear  清空字典  **
       dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']}
       dic.clear()  #把字典内容清空,不是把字典删除
       print(dic)
      
      # del  通过键删除键值对 **
      dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']}
      del dic['age']
      print(dic)#{'name': '太白', 'hobby_list': ['直男', '钢管', '开车']}
      #没有此键会报错
      del dic['age1']#keyerror: 'age1' 报错
      print(dic)
      
      # del dic 删除整个字典
      dic = {'name': '太白', 'age': 18}
      del dic
      print(dic)# name 'dic' is not defined   因为字典被删除了
      
      
      # 改:通过键值对直接改
      dic['name'] = 'alex'
      print(dic)
      
      # update
       dic = {'name': '太白', 'age': 18}
       dic.update(sex='男',heigth=175)
       print(dic)#{'name': '太白', 'age': 18, 'sex': '男', 'heigth': 175}
      
       dic = {'name': '太白', 'age': 18}
       dic.update([(1, 'a'),(2, 'b'),(3, 'c'),(4, 'd')])
       print(dic) # {'name': '太白', 'age': 18, 1: 'a', 2: 'b', 3: 'c', 4: 'd'}
      
       dic1 = {"name":"jin","age":18,"sex":"male"}
       dic2 = {"name":"alex","weight":75}
       dic2.update(dic1)
       print(dic2)#{'name': 'jin', 'weight': 75, 'age': 18, 'sex': 'male'}
       dic1.update(dic2)
       print(dic1) # {'name': 'alex', 'age': 18, 'sex': 'male', 'weight': 75}
      
      
      # 查
      #按键查值,缺点:没有键会报错,不建议用
      #通过键查询,直接dic[key](没有此键会报错)
      dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']}
      print(dic['hobby_list'])  #['直男', '钢管', '开车']
      print(dic['hobby_list1']) #报错  keyerror: 'hobby_list1'
      
      # get  ***【重点记】
      #没有键返回none,不会报错。可以设置返回值
      
       dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']}
       l1 = dic.get('hobby_list')
       print(l1)  #['直男', '钢管', '开车']
      
       l1 = dic.get('hobby_list','没有此键')  # 可以设置返回值: '没有此键'(返回值)
       print(l1)#['直男', '钢管', '开车']
      
       l1 = dic.get('hobby_list1')  
       print(l1)  #none    没有键返回none,不会报错
      
       l1 = dic.get('hobby_list1','没有此键')  # 可以设置返回值
       print(l1)  #没有此键(返回值)
      
      
      # 三个特殊的
      keys() values() items()
      # keys()
      # 一个高仿列表,存放的都是字典中的key
      print(dic.keys(),type(dic.keys()))   #dict_keys(['name', 'age', 'hobby_list']) <class 'dict_keys'>
      # 可以转化成列表
      print(list(dic.keys())) #['name', 'age', 'hobby_list']
      
      #循环遍历,打印键:
      #1
      for key in dic.keys():
          print(key)
      #2
      for key in dic:
          print(key)
      #结果:
      name
      age
      hobby_list
      
      
       # values()
       dic = {'name':'taibai', 'age': 18, 'hobby_list': ['直男','钢管','开车']}
       #一个高仿列表,存放都是字典中的value
       print(dic.values())#dict_values(['taibai', 18, ['直男', '钢管', '开车']])
       # 可以转化成列表
       print(list(dic.values()))#['taibai', 18, ['直男', '钢管', '开车']]
       #循环遍历,打印值:
       for value in dic.values():
           print(value)
      #结果:
       taibai
       18
       ['直男', '钢管', '开车']
      
      # items()
      dic = {'name':'taibai', 'age': 18, 'hobby_list': ['直男','钢管','开车']}
      # 一个高仿列表,存放是多个元祖,元祖中第一个是字典中的键,第二个是字典中的值  
      print(dic.items())#dict_items([('name', 'taibai'), ('age', 18), ('hobby_list', ['直男', '钢管', '开车'])])
      # 可以转化成列表
      print(list(dic.items())) #[('name', 'taibai'), ('age', 18), ('hobby_list', ['直男', '钢管', '开车'])]
      #循环遍历,打印所有键值对
      for key,value in dic.items():
          print(key,value)
      
      结果:
      name
      taibai
      age
      18
      hobby_list['直男', '钢管', '开车']
      
      #元组拆包,分别赋值
       a,b = ('name', '太白')
       print(a,b)
      
      #面试题:用一行代码将a和b的值互换
      a = 18
      b = 12
      a,b = b,a
      print(a,b)#12 18
      
      a,b= 12,18
      print(a,b)
      
      
    • 字典的嵌套【掌握】

      dic = {
          'name': '汪峰',
          'age': 48,
          'wife': [{'name': '国际章', 'age': 38},],
          'children': {'girl_first': '小苹果','girl_second': '小怡','girl_three': '顶顶'}
      }
      
      # # 1. 获取汪峰的名字。
       print(dic['name'])
       print(dic.get('name'))
      # # 2.获取这个字典:{'name':'国际章','age':38}。
       print(dic['wife'][0])   #{'name': '国际章', 'age': 38}
       print(dic.get('wife')[0])#{'name': '国际章', 'age': 38}
      # # 3. 获取汪峰妻子的名字。
       print(dic.get('wife')[0].get('name'))#国际章
       print(dic.get('wife')[0]['name'])#国际章
       print(dic['wife'][0]['name'])#国际章
      # # 4. 获取汪峰的第三个孩子名字。
       print(dic.get('children').get('girl_three'))#顶顶
       print(dic.get('children')['girl_three'])#顶顶
       print(dic['children']['girl_three'])#顶顶