目录
字典
字典是什么
字典是一种存储
键值对
的结构
.
啥是
键值对
?
这是计算机
/
生活中一个非常广泛使用的概念
.
把 键
(key)
和 值
(value)
进行一个一对一的映射
,
然后就可以根据键
,
快速找到值
.
举个栗子 , 学校的每个同学 , 都会有一个唯一的学号 .知道了学号 , 就能确定这个同学 .此处 " 学号 " 就是 " 键 ", 这个 " 同学 " 就是 " 值"
创建字典
创建一个空的字典
.
使用
{ }
表示字典
a = { }
b = dict()
print(type(a))
print(type(b))
也可以在创建的同时指定初始值
键值对之间使用
,
分割
,
键和值之间使用
:
分割
. (
冒号后面推荐加一个空格
).
使用
print
来打印字典内容
student = { 'id': 1, 'name': 'zhangsan' }
print(student)
为了代码更规范美观
,
在创建字典的时候往往会把多个键值对
,
分成多行来书写
student = {
'id': 1,
'name': 'zhangsan'
}
最后一个键值对
,
后面可以写
,
也可以不写
student = {
'id': 1,
'name': 'zhangsan',
}
查找 key
# 1. 使用 in 来判定某个key 是否在字典中存在
a = {
'id': 1,
'name': 'zhangsan'
}
print('id' in a) # True
print('classId' in a) # False
# in 只是判定 key 是否存在 和 value无关
print('zhangsan' in a) # False
# not in 来判断key 在字典中不存在 都是只喝key有关 就是第一个参数
print('id' not in a) # False
print('classId' not in a) # True
# 2. 使用[]来根据key获取value
a = {
'id':1,
'name': 'zhangsan',
100:'lisi'
}
print(a['id'])
print(a['name'])
print(a[100])
使用
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'])
新增/修改元素
# 字典的各种操作都是针对key来进行的!
# 1. 在字典中新增元素,使用[]来进行
a = {
'id': 1,
'name': 'zhangsan',
}
# 这个操作 就是往字典里面插入新的键值对
a['score'] = 90
print(a)
# 2. 在字典中 根据key 修改value 也是使用[] 来进行的
a['score'] = 100
print(a)
# 3. 使用pop()方法 根据key 删除键值对
a.pop('name')
print(a)
使用
[ ]
可以根据
key
来新增
/
修改
value.
如果
key
不存在
,
对取下标操作赋值
,
即为新增键值对
student = {
'id': 1,
'name': 'zhangsan',
}
student['score'] = 90
print(student)
如果
key
已经存在
,
对取下标操作赋值
,
即为修改键值对的值
.
student = {
'id': 1,
'name': 'zhangsan',
'score': 80
}
student['score'] = 90
print(student)
删除元素
使用
pop
方法根据
key
删除对应的键值对
.
student = {
'id': 1,
'name': 'zhangsan',
'score': 80
}
student.pop('score')
print(student)
遍历字典元素
字典设计的初衷,不是为了实现遍历,而是为了增删改查
字典是 哈希表 进行增删改查操作,效率都是非常糕的!!
而字典的遍历则效率就要差一些
在c++中 哈希表里面的键值对存储时无序的!
但是在python中还不太一样~~ python 中做了特殊处理~~能够保证遍历出来的顺序 就是和插入的顺序是一致的
直接使用
for
循环能够获取到字典中的所有的
key,
进一步的就可以取出每个值了
student = {
'id': 1,
'name': 'zhangsan',
'score': 80
}
for key in student:
print(key, student[key])
取出所有
key
和
value
# keys 获取字典中所有的key # values 获取字典中所有的value # itmes 获取字典中所有的键值对
使用
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 类似 .
那么就会存在另外一种遍历的方式:
for key, value in a.items() :
print(key,value)
合法的 key 类型
# 使用hash 函数能够计算出一个变量的哈希值
print(hash(0))
print(hash(3.14))
print(hash(0.2))
print(hash(True))
print(hash('hello'))
print(hash((1,2,3)))
# print(hash([1,2,3])) 不可hash
# print(hash({})) 不可hash
# 也就是说 不可变的对象 一般就是可以hash的 可变对象一般就是不可hash的
不是所有的类型都可以作为字典的
key.
字典本质上是一个
哈希表
,
哈希表的
key
要求是
"
可哈希的
",
也就是可以计算出一个哈希值
.
可以使用 hash 函数计算某个对象的哈希值 .但凡能够计算出哈希值的类型 , 都可以作为字典的 key
print(hash(0))
print(hash(3.14))
print(hash('hello'))
print(hash(True))
print(hash(())) # ( ) 是一个空的元组
列表无法计算哈希值
.
print(hash([1, 2, 3]))
字典也无法计算哈希值
print(hash({ 'id': 1 }))
小结
字典也是一个常用的结构
.
字典的所有操作都是围绕
key
来展开的
.
需要表示
"
键值对映射
"
这种场景时就可以考虑使用字典
.