(一)什么是字典
Python字典是一种可变、无序且可嵌套的数据类型,用于存储键值对。字典中的每个键(key)都唯一且不可变,它对应一个值(value)。
啥是键值对? 这是计算机/生活中一个非常广泛使用的概念:
- 把 键(key) 和 值(value) 进行一个一对一的映射, 然后就可以根据键, 快速找到值.(底层相当于hash)
举个栗子:
- 学校的每个同学, 都会有一个唯一的学号.
- 知道了学号, 就能确定这个同学.
- 此处 "学号" 就是 "键", 这个 "同学" 就是 "值"
此外字典的创建方式是使用花括号{},并使用冒号将键和值分隔开来。
(二)字典的基本操作
2.1 创建字典
可以通过以下方式创建一个字典:
- 创建一个空的字典. 使用 { } 表示字典
a = { } # 空字典 b = dict() # 空字典 print(type(a)) print(type(b))
输出结果展示:
- 也可以在创建的同时指定初始值,键值对之间使用 , 分割, 键和值之间使用 : 分割. (冒号后面推荐加一个空格).
student = { 'id': 1, 'name': 'zhangsan' } # 包含两个键值对的字典 print(student)
输出结果展示:
- 为了代码更规范美观, 在创建字典的时候往往会把多个键值对, 分成多行来书写.
student = { 'id': 1, 'name': 'zhangsan' }
- 最后一个键值对, 后面可以写 , 也可以不写
- 此外还可以使用参数来创建字典
student=dict(id=1,name='zhangsan') #左侧是键,右侧是值 print(student)
输出结果展示:
- 元组可以作为字典中的key来创建字典
t=(10,20,30) print({t:10}) #t是key,10是value。元祖可以作为字典中的key
输出结果展示:
- 列表不可以创建字典
2.2 查找 key
- 使用 in 可以判定 key 是否在 字典 中存在. 返回布尔值
student = { 'id': 1, 'name': 'zhangsan', } print('id' in student) print('score' in student)
输出结果展示:
- 使用 [ ] 通过类似于取下标的方式, 获取到元素的值. 只不过此处的 "下标" 是 key. (可能是整数, 也可能是字符串等其他类型)
student = { 'id': 1, 'name': 'zhangsan', } print(student['id']) print(student['name'])
输出结果展示:
- 如果 key 在字典中不存在, 则会抛出异常
student = { 'id': 1, 'name': 'zhangsan', } print(student['score'])
输出结果展示:
2.3 新增/修改元素
使用 [ ] 可以根据 key 来新增/修改 value
- 如果 key 不存在, 对取下标操作赋值, 即为新增键值对
student = { 'id': 1, 'name': 'zhangsan', } student['score'] = 90 # 添加键为'score',值为'90'的键值对 print(student)
输出结果展示:
- 如果 key 已经存在, 对取下标操作赋值, 即为修改键值对的
student = { 'id': 1, 'name': 'zhangsan', 'score': 80 } print(student) student['score'] = 90 # 将score的值修改为90 print(student)
输出结果展示:
2.4 删除元素
- 使用 pop 方法根据 key 删除对应的键值对
student = { 'id': 1, 'name': 'zhangsan', 'score': 80 } print(student) student.pop('score') # 删除键为'score'的键值对 print(student)
输出结果展示:
- 也可以使用
del
语句删除字典中的键值对
student = { 'id': 1, 'name': 'zhangsan', 'score': 80 } print(student) del student['score'] # 删除键为'score'的键值对 print(student)
2.5 遍历字典元素
直接使用 for 循环能够获取到字典中的所有的 key, 进一步的就可以取出每个值了
student = { 'id': 1, 'name': 'zhangsan', 'score': 80 } # 遍历所有键 for key in student: print(key) # 遍历所有值 for value in student.values(): print(value) # 遍历所有键值对 for key, value in student.items(): print(f'{key}: {value}')
2.6 取出所有 key 和 value
- 使用 keys 方法可以获取到字典中的所有的 key
student = { 'id': 1, 'name': 'zhangsan', 'score': 80 } print(student.keys())
输出结果展示:
- 此处 dict_keys 是一个特殊的类型, 专门用来表示字典的所有 key. 大部分元组支持的操作对于dict_keys 同样适用.
- 使用 values 方法可以获取到字典中的所有 value
student = { 'id': 1, 'name': 'zhangsan', 'score': 80 } print(student.values())
输出结果展示:
- 此处 dict_values 也是一个特殊的类型, 和 dict_keys 类似.
- 使用 items 方法可以获取到字典中所有的键值对
student = { 'id': 1, 'name': 'zhangsan', 'score': 80 } print(student.items())
输出结果展示:
- 此处 dict_items 也是一个特殊的类型, 和 dict_keys 类似.
(三)合法的 key 类型
- 首先不是所有的类型都可以作为字典的 key.
- 字典本质上是一个 哈希表, 哈希表的 key 要求是 "可哈希的", 也就是可以计算出一个哈希值
- 可以使用 hash 函数计算某个对象的哈希值.但凡能够计算出哈希值的类型, 都可以作为字典的 key
- 列表无法计算哈希值
- 字典也无法计算哈希值
(四)小结
字典也是一个常用的结构. 字典的所有操作都是围绕 key 来展开的.需要表示 "键值对映射" 这种场景时就可以考虑使用字典.