Python 语言-第四章典型数据结构之字典


4.3 字典 (dictionary)

4.3.1 认识字典

  • 什么是字典
    • 由一组键 (key)与之对应的值(value)所构成,键与值之间用冒号分隔,键与值之间的关系一一对应。键的作用相当于索引。
  • 特点:
    • 可变序列,以 key-value 存储,key 不能重复
    • 元素无序
      • 因为字典的存放过程会经过哈希算法计算存储位置,所以无法确定其排列顺序
    • 可以根据需要动态的伸缩
    • 浪费较大内存
      • 因为使用哈希算法进行排序,所以不能确定其位置,就造成内存的浪费
  • 字典示意图
    image-20220112211955652
  • 实现原理:key 通过 hash 计算得到 value 的位置,再去读取

4.3.1 创建字典

  • 使用花括号:{}

    • 最常用

    • 语法格式:

      字典名={键1:值1[,键2:值2,……,键n:值n]}
      
      • 键是不可变类型,值是可变类型
      • 如果花括号内没有任何元素,则会创建一个空字典
  • 使用dict()内置函数

    dict=dict()
    

4.3.2 基本操作

4.3.2.1 获取字典中的元素

  • 使用:[]

    • 语法格式:

      字典名[键]
      
      • 例如:

        dic['Hello']
        
    • 如果键未在字典内,则会发生 KeyError 错误

    • 如果字典中键的本身也是字典,则需要使用多个键来访问字典元素

    • 如果字典中的键的值是列表或元组,则需要同时使用键和索引来访问字典元素

  • 使用get()方法

    • 例如:

      dic.get('Hello')
      
    • 如果键未在字典内,会返回 None,可以设置默认的 value,以便 key 不存在时返回

4.3.2.2 key 的判断

  • 检测键是否存在于字典中使用:in 运算符

  • 运算符 说明
    in 指定的 key 存在于在字典中返回 True
    not in 指定的 key 不存在于字典中返回 True
  • 例如:

    "Hello" in dict1
    

4.3.2.3 添加、更新字典元素

  • 语法格式:

    字典名[键]=值
    

4.3.2.4 删除字典元素和字典

  • dic.pop(key) :删除 dic 中的键(keys)并返回相应的值

  • dic.pop(key[,value]) :删除 dic 中的键(keys)并返回对应的值,如果键不在 dic 中,则返回 value (默认为 None )

  • dic.popitem() :删除一个元素,并返回一个键和值组成的元组

  • del

    • 语法格式:

      del 字典[键]
      

4.3.3 获取字典视图

  • 获取键(key)

    • 使用keys()方法
  • 获取值(value)

    • 使用values()方法
  • 获取键值对

    • 使用items()方法
  • 可以将获取的字典视图作为参数传入 list() 函数可以获取字典中的所组成的列表

    • 例如:获取所有的 key 组成的视图转换为列表

      dict1 = {"Hello":"World","我的生命之源":"你"}
      print(list(dict1.keys()))
      
      ['Hello', '我的生命之源']
      
    • 例如:获取所有的 key-value 组成的视图转换为”列表“

      dict1 = {"Hello":"World","我的生命之源":"你"}
      print(list(dict1.items()))
      
      [('Hello', 'World'), ('我的生命之源', '你')]
      
      • 列表中的元素变为了元组

4.3.4 字典元素遍历

  • 使用 for 循环

  • 例如:

    dict1 = {'zs':10,'ls':20,'ww':30}
    for item in dict1:
        print("遍历的键:{0}\n遍历的值:{1}\n遍历的值:{2}".format(item,dict1[item],dict1.get(item)))
    
    遍历的键:zs
    遍历的值:10
    遍历的值:10
    遍历的键:ls
    遍历的值:20
    遍历的值:20
    遍历的键:ww
    遍历的值:30
    遍历的值:30
    

4.3.5 字典生成式

  • 跟列表类似:

    { 自定义的键:自定义的值  for 自定义变量 in 可迭代对象}
    
  • 问题实操:如果有两个列表,一个作为键、一个作为值,该怎么转换为字典呢?

    • 将两个列表作为参数,将对象的元素打包为一个元组,再进行返回为字典
  • zip():用于将可迭代的对象作为参数,将对象的元素打包为一个元组

  • 答案:

    lst1 = ['hello','时间','地点']
    lst2 = ['World','2020年']
    dict1 = {item.upper():price for item,price in zip(lst1,lst2)}
    print(dict1)
    
    {'HELLO': 'World', '时间': '2020年'}
    
  • 解释:

    • item.upper:表示字典 key 的表达式
    • price:表示字典 value 的表达式
    • item 和 price:表示自定义的 key、value 的变量
    • zip(lst1,lst2):可迭代对象

4.3.6 其他常用方法

方法 描述
dic.fromkeys(序列,[值]) 创建一个新字典,并使用序列中的元素作为键,使用初始的值作为所有键对映的初始值(默认为 None )
dic.copy() 用于获取字典的一个副本
dic.claer() 删除 dic 里面的所有元素,使其变为空字典
dic.setdefault(key[,value]) 如果字典中存在键,则返回键对应的值,否则在 dic 中添加 key:value
返回的 value(默认为 None)
dic.update(dic2) 将 dic2 中的元素添加到 dic1 里面