Featured image of post python——字典

python——字典

python字典

字典

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)也为真。

6.2 字典在内存中开销巨大,典型的空间换时间

6.3 键查询速度很快

6.4 往字典里面添加新建可能导致扩容,导致散列表中键的次序变化。因此,不要在遍历字典的同时进行字典的修改。

Licensed under CC BY-NC-SA 4.0