015.Python基础语法_字典操作

无奋斗不青春

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈

分隔线

字典

概念

  • 概念
    • 无序的、可变的键值对集合

定义

  • 实例化类对象,创建空字典
    dic = dict()
    
  • 通过{}定义
    dic = {key1: value1, key2: value,...}
    
  • 通过fromkeys()静态方法
    • 静态方法:类和对象都可以调用的方法
    分类
        静态方法
    作用
        创建一个字典,key为序列中的元素,value为指定的值
    语法
        dict.fromkeys(seq, v=None)
    参数
        seq:指定序列,其中的元素将作为字典的key
        v:指定的值,生成字典的所有key的值都是同样的
    返回值
        返回一个新的字典对象
        通过对象调用该方法,并不会修改原字典对象,而是生成一个新的字典对象
        
    
    # 示例
    # 类调用方法1
    d = dict.fromkeys(['a', 'b', 'c'], 666)
    print(d)
    
    # -----输出结果-----
    {'a': 666, 'b': 666, 'c': 666}
    
    # 类调用方法2
    d = dict.fromkeys(['a', 'b', 'c'], [666, 777, 888])
    print(d)
    
    # -----输出结果-----
    {'a': [666, 777, 888], 'b': [666, 777, 888], 'c': [666, 777, 888]}
    
    # 实例化对象调用
    dic = dict()
    d = dic.fromkeys(['a', 'b', 'c'], [666, 777, 888])
    print(dic)
    print(d)
    
    # -----输出结果-----
    {}
    {'a': [666, 777, 888], 'b': [666, 777, 888], 'c': [666, 777, 888]}
    
  • 注意事项
    • key不能重复,如果重复,后值会将前值覆盖掉
    • key必须是任意不可变类型
      • 可变类型:列表、字典、可变集合…
      • 不可变类型:数值、布尔、字符串、元组…
      • 值发生改变后,id不变的为可变类型;值发生改变后,id跟着发生改变的为不可变类型
  • 注意事项原理简介
    • Python的字典是采用哈希(hash)的方式实现的
    • 简单存储过程
      • 1、初始化一个“哈希表”,用来存放所有的值
      • 2、存储一个键值对的时候
        • 首先会根据key通过一系列的计算,得到一个在“哈希表”中的索引位置
        • 再根据索引位置将给定的值进行存储
    • 简单查找过程
      • 首先使用哈希函数将给定的key转换为对应的哈希表的索引
      • 根据索引定位到哈希表的位置,获取到存储的value
    • 综上所述
      • 如果key相同,那么得到哈希表索引则会相同,第二个值存储进去的时候,就会直接覆盖掉第一个值
      • 如果key可变,存储的时候key是"b",会根据这个key计算一个哈希表的索引存储value,如果后续这个key变成了"bb",在取值的时候,会根据"bb"计算出一个哈希表的索引,根据这个新的索引是查询不到value的
    • 补充:哈希表索引计算原理
      • 通过“哈希函数”将一个给定的key转换成一个整型数字(哈希值)
      • 将该哈希值对数组长度进行取余,取余结果就当做数组的下标
      • 如果产生了“哈希冲突”(不同的key计算出来的哈希值相同)则采用“开发寻址法”(通过探测函数查找下一个空位)
  • 字典存在的意义
    • 1、可以通过key方位对应的值,使得这种访问更具意义
    • 2、查询效率得到很大的提升(获取值不再需要通过遍历的方式获取)

常用操作

  • 通过key直接添加
    dict[key] = value
    

  • 通过del语句
    del dict            # 删除整个dict对象
    del dict[key]       # 删除指定key的键值对
    
    # key必须存在,否则报KeyError错误
    
    
    # 示例
    dic = {'name': '失心疯', 'age': 36}
    
    # del dic  # 删除整个dict对象
    # print(dic)      # --> NameError: name 'dic' is not defined
    
    del dic['age']  # 删除指定key的键值对
    print(dic)        # --> {'name': '失心疯'}
    
  • 通过pop()方法
    分类
        对象方法
    作用
        删除指定的键值对,并返回对应的值
        如果key不存在,直接返回给定的default值,不作删除动作
        如果没有给定的default值,则报错
    语法
        dict.pop(key[, default])
    参数
        key:要删除指定键值对的键(key)
        default:给定的默认值,key不存在时的返回值
    返回值
        key存在时,返回被删除的键值对的值(value)
        key不存在时,返回给定的default值,没有给定的default值,则报错
        
    
    # 示例
    dic = {'name': '失心疯', 'age': 36}
    r = dic.pop('age')
    
    print(r)        # --> 36
    print(dic)      # --> {'name': '失心疯'}
    
    
    dic = {'name': '失心疯', 'age': 36}
    r = dic.pop('sex', '没有该key')
    print(r)        # --> 没有该key
    print(dic)      # --> {'name': '失心疯', 'age': 36}
    
    
    dic = {'name': '失心疯', 'age': 36}
    r = dic.pop('sex')
    print(r)       # --> KeyError: 'sex'
    print(dic)
    
  • 通过popitem()方法
    分类
        对象方法
    作用
        删除字典最末尾的一组键值对,并以元组的形式返回该键值对
        如果字典为空,则报错
    语法
        dict.popitem()
    返回值
        以元组的形式返回被删除的键值对
        如果字典为空,则报错
    
    # 示例
    dic = {'大': 1, 'd': 5, 1: 3, 'e': 4, '在': 2}
    
    for i in range(len(dic)):
        r = dic.popitem()
        print(r, dic)
    
    # ----输出结果-----
    ('在', 2) {'大': 1, 'd': 5, 1: 3, 'e': 4}
    ('e', 4) {'大': 1, 'd': 5, 1: 3}
    (1, 3) {'大': 1, 'd': 5}
    ('d', 5) {'大': 1}
    ('大', 1) {}
    
  • 通过clear()方法
    分类
        对象方法
    作用
        删除字典所有键值对,返回None
        字典对象本身还存在,只是字典的键值对被清空了
    语法
        dict.clear()
    返回值
        返回None
    注意
        注意与del dict的区别,del dict是直接删除dict对象
        dict.clear是清空dict里面的键值对,dict对象还存在
        
    # 示例
    dic = {'d': 5, '大': 1, 1: 3, 'e': 4, '在': 2}
    r = dic.clear()
    print(r, dic)
    
    # -----输出结果-----
    None {}
    

  • 只能修改value,不能修改key
  • 修改单个键值对
    dict[key] = value
    
    # key存在,修改value
    # key不存在,新增键值对
    
    
    # 示例
    dic = {'name': '失心疯', 'age': 36}
    dic['age'] = 18
    
    print(dic)      # --> {'name': '失心疯', 'age': 18}
    
    dic['sex'] = '男'
    print(dic)      # --> {'name': '失心疯', 'age': 18, 'sex': '男'}
    
  • 批量修改键值对
    oldDict.update(newDict)
    
    # 根据新字典批量修改原字典中的键值对
    # 原字典中不存在对应的key,则新增键值对
    
    
    # 示例
    olddic = {'name': '失心疯', 'age': 36}
    newdic = {'name': '失心疯', 'age': 18, 'sex': '男'}
    
    olddic.update(newdic)
    print(olddic)       # --> {'name': '失心疯', 'age': 18, 'sex': '男'}
    

  • 获取单个值
    • 方式一:dict[key]
      # 获取指定key对应的值value
      # 注意:如果key不存在,会报错
      
    • 方式二:dict.get(key[, default])
      # 获取指定key对应的值value
      # 如果key不存在,则返回给定的default值
      # 如果没有给定的default值,则返回None
      
    • 方式三:dict.setdefault(key[, default=None])
      方式三:dict.setdefault(key[, default=None])
      # 获取指定key对应的值value
      # 如果key不存在,则新增key,并设置值为默认的default值
      # 如果没有给定的default值,则将key的值设置为None
      
    • 示例
    # 方式一示例
    dic = {'name': '失心疯', 'age': 36}
    
    # key存在,返回key对应的值36
    r1 = dic['age']
    print(r1)               # --> 36
    
    # key不存在则报错,KeyError: 'sex'
    r42 = dic['sex']        # --> KeyError: 'sex'
    # print(r2)
    
    # 字典内容不发生改变
    print(dic)              # --> {'name': '失心疯', 'age': 36}
    
    
    # 方式二示例
    dic = {'name': '失心疯', 'age': 36}
    
    # key存在,返回key对应的值36
    r3 = dic.get('age')     # --> 36
    
    # key不存在,没有设置default值,则返回None
    r5 = dic.get('sex')     # --> None
    
    # key不存在,设置了default值,则返回设置的default值
    r6 = dic.get('sex', '没有此key')     # --> 没有此key
    
    # 字典内容不发生改变
    print(dic)              # --> {'name': '失心疯', 'age': 36}
    
    
    # 方式三示例
    dic = {'name': '失心疯', 'age': 36}
    # key存在,返回key对应的值36
    r7 = dic.setdefault('age')
    print(r7)       # --> None
    print(dic)      # -->  {'name': '失心疯', 'age': 36}
    
    dic = {'name': '失心疯', 'age': 36}
    # key不存在,没有设置default值,则返回None,并将key和None作为键值对添加到字典中
    r8 = dic.setdefault('sex')
    print(r8)       # --> None
    print(dic)      # --> {'name': '失心疯', 'age': 36, 'sex': None}
    
    dic = {'name': '失心疯', 'age': 36}
    # key不存在,设置了default值,则返回设置的default值,并将key和default值作为键值对添加到字典中
    r9 = dic.setdefault('sex', '男')
    print(r9)       # --> None
    print(dic)      # --> {'name': '失心疯', 'age': 36, 'sex': '男'}
    
  • 获取所有值
    • dict.values()
    分类
        对象方法
    作用
        获取字典中所有的值value
    语法
        dict.values()
    参数
        
    返回值
        返回一个dictionary view object(字典视图对象)dict_values([value1, value2, ...])
    
  • 获取所有键
    • dict.keys()
    分类
        对象方法
    作用
        获取字典中所有的键key
    语法
        dict.keys()
    参数
        
    返回值
        返回一个dictionary view object(字典视图对象)dict_keys([key1, key2, ...])
    
  • 获取所有键值对
    • dict.items()
    分类
        对象方法
    作用
        获取字典中所有的键值对
    语法
        dict.items()
    参数
        
    返回值
        返回一个dictionary view object(字典视图对象)dict_items([(key1, value1), (key2, value2),  ...])
    
  • 注意事项
    • 这里通过dict.keys()dict.values()dict.items()获取所有的key、value和键值对,返回的都是dictionary view object(字典视图对象),并不能直接取值。
    • 可以通过list、tuple等方法将字典视图对象转换成列表或者元组等,再利用索引进行取值
    • 也可以通过for…in 的方式遍历取值
  • 遍历
    • 遍历所有的key
    for 变量 in dict.keys():
        # 获取key
        print(变量)
        
        # 根据key获取value
        print(dcit[变量])
        
    
    • 遍历所有的键值对
    for 变量1, 变量2 in dict.items():
        # 获取key
        print(变量1)
        
        # 获取values
        print(变量2)
    

补充

  • python2与python3中keys()、values()、items()的区别

  • 我们先通过代码运行来看下结果

    • python2环境
    # python2环境
    
    dic = {'name': '失心疯', 'age': 36, 'sex': '男'}
    
    vs = dic.values()
    ks = dic.keys()
    itm = dic.items()
    
    print(vs)
    print(ks)
    print(itm)
    
    dic['address'] = '中国湖南'
    print(dic)
    
    print(vs)
    print(ks)
    print(itm)
    
    # -----输出结果-----
    ['失心疯', 36, '男']
    ['name', 'age', 'sex']
    [('name', '失心疯'), ('age', 36), ('sex', '男')]
    
    {'name': '失心疯', 'age': 36, 'sex': '男', 'address': '中国湖南'}
    
    ['失心疯', 36, '男']
    ['name', 'age', 'sex']
    [('name', '失心疯'), ('age', 36), ('sex', '男')]
    
    • python3环境
    dic = {'name': '失心疯', 'age': 36, 'sex': '男'}
    
    vs = dic.values()
    ks = dic.keys()
    itm = dic.items()
    
    print(vs)
    print(ks)
    print(itm)
    
    dic['address'] = '中国湖南'
    print(dic)
    
    print(vs)
    print(ks)
    print(itm)
    
    
    # -----输出结果-----
    dict_values(['失心疯', 36, '男'])
    dict_keys(['name', 'age', 'sex'])
    dict_items([('name', '失心疯'), ('age', 36), ('sex', '男')])
    
    {'name': '失心疯', 'age': 36, 'sex': '男', 'address': '中国湖南'}
    
    dict_values(['失心疯', 36, '男', '中国湖南'])
    dict_keys(['name', 'age', 'sex', 'address'])
    dict_items([('name', '失心疯'), ('age', 36), ('sex', '男'), ('address', '中国湖南')])
    
    
    • 从输出结果来看,python2是直接返回的列表,python3返回的是字典视图对象
    • python2在获取到结果后就固定了,字典发生改变,之前所取到的结果不会跟随字典的修改而改变
    • python3获取到结果之后,字典发生改变,之前索取到的结果会跟随字典的修改而发生相应的改变

计算

  • 获取键值对个数
    len(dict)
    

判定

  • 判断指定key是否存在

    key in dict
    
  • 判断指定key是否不存在

    key not in dict
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失心疯_2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值