字典
1. 定义
字典是“键值对”的无序可变序列
a={'name':'xybg','age':'20','sex':'women'}
a
{‘name’: ‘xybg’, ‘age’: ‘20’, ‘sex’: ‘women’}
- 字典中的每个元素都是一个“键值对”,包含:“键对象”和“值对象”。可以通过“键对象”实现快速获取、删除、更新对应的“值对象”。
- 列表中我们通过“下标数字”找到对应的对象。字典中通过“键对象”找到对应的“值对象”。“键”是任意的不可变数据,比如:整数、浮点数、字符串、元组。但是:列表、字典、集合这些可变对象,不能作为“键”。并且“键”不可重复。
- “值”可以是任意的数据,并且可重复。
2. 创建
2.1.1通过{}、dict()来创建字典对象
b=dict(name='xybg',age='20',sex='women')
b
{‘name’: ‘xybg’, ‘age’: ‘20’, ‘sex’: ‘women’}
a={'name':'xybg','age':'20','sex':'women'}
a
{‘name’: ‘xybg’, ‘age’: ‘20’, ‘sex’: ‘women’}
2.1.2 通过zip()创建字典对象
k = ['name','age','job']
v = ['xybg',20,'student']
d = dict(zip(k,v))
d
{‘name’: ‘xybg’, ‘age’: 20, ‘job’: ‘student’}
2.1.3 通过fromkeys创建值为空的字典
a= dict.fromkeys(['name','age','job'])
a
{‘name’: None, ‘age’: None, ‘job’: None}
3. 字典元素的访问
设定一个字典对象:a = {‘name’:‘xybg’,‘age’:20,‘job’:‘student’}
3.1 通过 [键] 获得“值”。若键不存在,则抛出异常。
a['name']
‘xybg’
a['sex']
Error
3.2 通过get()方法获得“值”。
优点是:指定键不存在,返回None;也可以设定指定键不存在时默认返回的对象。推荐使用get()获取“值对象”。
a.get('name')
‘xybg’
a.get('sex','woman')
‘woman’
3.3 列出所有的键值对
a.items()
dict_items([(‘name’, ‘xybg’), (‘age’, ‘20’), (‘job’:‘student’)])
3.4 列出所有的键,列出所有的值
a.keys()
dict_keys([‘name’, ‘age’, ‘job’])
a.values()
dict_values([‘xybg’, 20, ‘student’])
3.5 len() 键值对的个数
len(a)
3
3.6 检测一个“键”是否在字典中
"name" in a
True
4 字典元素添加、修改、删除
4.1 给字典新增“键值对”。如果“键”已经存在,则覆盖旧的键值对;如果“键”不存在,则新增“键值对”。
b=dict(name='xybg',age='20',sex='woman')
b['job']='student'
a['age']='15'
{‘name’: ‘xybg’, ‘age’: 15, ‘sex’: ‘woman’, ’job’:’student’ }
4.2 使用update()将新字典中所有键值对全部添加到旧字典对象上。如果key有重复,则直接覆盖。
a={'name':'yk','age':'14'}
b={'name':'xybg','age':'20','sex':'女'}
a.update(b)
a
{‘name’: ‘xybg’, ‘age’: ‘20’, ‘sex’: ‘女’}
4.3 字典中元素的删除,可以使用del()方法;或者clear()删除所有键值对;pop()删除指定键值对,并返回对应的“值对象”。
a = {'name':'xybg','age':20,'job':'student'}
del(a['name'])
a
{‘age’: 20, ‘job’: ‘student’}
b = a.pop('job')
b
student
4.4 popitem() :随机删除和返回该键值对。字典是“无序可变序列”,因此没有第一个元素、最后一个元素的概念;popitem弹出随机的项,因为字典并没有"最后的元素"或者其他有关顺序的概念。若想一个接一个地移除并处理项,这个方法就非常有效(因为不用首先获取键的列表)。
c={'name':'xybg','age':'20','sex':'女'}
c.popitem()
c
{‘name’: ‘xybg’, ‘age’: ‘20’}
5 核心底层原理(重要)
字典对象的核心是散列表。散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做bucket。每个bucket有两部分:一个是键对象的引用,一个是值对象的引用。由于,所有bucket结构和大小一致,我们可以通过偏移量来读取指定bucket。
6 用法总结
6.1键必须可散列
(1)数字、字符串、元组,都是可散列的。
(2)自定义对象需要支持下面三点:
a. 支持hash()函数
b. 支持通过__eq__()方法检测相等性
c. 若a==b为真,则hash(a)==hash(b)也为真。