我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 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