目录
- 0.什么是字典?
- 1.创建字典
- 2.查找key
- 3.新增/修改元素
- 4.删除元素
- 5.遍历字典元素
- 6.取出所有 key 和 value
- 7.合法的key类型
0.什么是字典?
- 字典是一种存储键值对(K-V)的结构
- 但是
key
不能重复
- 但是
- 以C/C++的视角看,就是
map
- 注意:
- 一个字典中的
key
的类型不一定都一样- 但是字典对于
key
是啥类型,有约束
- 但是字典对于
- 一个字典中的
value
的类型不一定都一样- 字典对于
value
是啥类型,没约束
- 字典对于
- 一个字典中的
1.创建字典
- 创建一个空的字典,使用
{}
表示字典a = { } b = dict() print(type(a)) print(type(b))
- 可以在创建的同时指定初始值
- 键值对之间使用
,
分割, - 键和值之间使用
:
分割student = { 'id': 1, 'name': 'SnowK' }
- 键值对之间使用
- 为了代码更规范美观,在创建字典的时候往往会把多个键值对,分成多行来书写
student = {'id': 1,'name': 'SnowK' }
2.查找key
- 使用
in
可以判定key
是否在字典中存在,返回布尔值student = {'id': 1,'name': 'zhangsan', }print('id' in student)
- 使用
[]
通过类似于取下标的方式,获取到元素的值,只不过此处的"下标"是key
- 如果
key
在字典中不存在, 则会抛出异常student = {'id': 1,'name': 'zhangsan', }print(student['id']) print(student['name'])
- 如果
- 总结:
- 对于字典来说,使用
in
或者[]
来获取value
,都是非常高效的操作- 哈希表
- 对于列表来说,使用
in
比较低小,而是用[]
比较高效in
:需要把整个列表遍历一遍[]
:类似于数组/顺序表取下标
- 对于字典来说,使用
3.新增/修改元素
- 使用
[]
可以根据key
来新增/修改value
- 如果
key
不存在,对取下标操作赋值,即:新增键值对student = {'id': 1,'name': 'zhangsan', }student['score'] = 90
- 如果
key
已经存在,对取下标操作赋值,即:修改键值对的值student = {'id': 1,'name': 'zhangsan','score': 80 }student['score'] = 90
- 如果
4.删除元素
- 使用
pop()
方法根据key
删除对应的键值对student = {'id': 1,'name': 'zhangsan','score': 80 }student.pop('score')
5.遍历字典元素
- Python能够保证遍历出来的顺序,就是和插入的顺序是一致的
- 这一点和C++中的
map / unordered_map
不同
- 这一点和C++中的
- 直接使用
for
循环,就能够获取到字典中的所有的key
,进一步的就可以取出每个值了student = {'id': 1,'name': 'zhangsan','score': 80 }for key in student:print(key, student[key])
6.取出所有 key 和 value
- 使用
keys()
可以获取到字典中的所有的key
- 返回类型是
dict_keys
,可以当作一个列表来使用student = {'id': 1,'name': 'zhangsan','score': 80 }print(student.keys())
- 返回类型是
- 使用
values()
可以获取到字典中的所有value
- 返回类型是
dict_values
,可以当作一个列表来使用student = {'id': 1,'name': 'zhangsan','score': 80 }print(student.values())
- 返回类型是
- 使用
items()
可以获取到字典中所有的键值对- 返回类型是
dict_items
,是一个列表一样的结构,里面每个元素都是一个元组,元组里面包含了键值对student = {'id': 1,'name': 'zhangsan','score': 80 }print(student.items())for key, value in student.items():print(key, value)
- 返回类型是
7.合法的key类型
- 不是所有的类型都可以作为字典的
key
- 字典本质上是一个哈希表,哈希表的
key
要求是"可哈希的",也就是可以计算出一个哈希值- 可以使用
hash()
计算某个对象的哈希值 - 但凡能够计算出哈希值的类型,都可以作为字典的
key
- 不可变对象,一般就是可哈希的
- 可变的对象,一般就是不可哈希的
- 可以使用
- 列表和字典无法计算哈希值