字典
- 字典是“键值对”的无序可变序列,字典中的每一个元素都是一个键值对,包含键对象和值对象。可以通过键对象实现快速获取、删除、更新对应的值对象。
- 字典中的**“键”**是任意的不可变数据,如:整数、浮点数、字符串、元组且键具有唯一性(不可重复);而字典中的“值”可以是任意数据,并且可重复。
字典的创建
- 可通过{}、dict() 来创建字典对象:
a = {"name": "小明", "age": 18, "job": "programmer"}
b = dict(name = "xiaoming", age = 18, job = "programmer")
c = dict([("name", "xiaoming"), ("age", 18)])
# 创建空的字典对象
e = {}
f = dict()
- 通过zip() 创建对象:
a = ["name", "age", "job"]
b = ["xiaoming", 18, "programmer"]
c = dict(zip(a, b))
print(c) # {'name': 'xiaoming', 'age': 18, 'job': 'programmer'}
注:zip(列表1,列表2,……)将多个列表对应位置的元素组合成为元组,并返回这个zip对象。
- 通过 dict.fromkeys() 创建值为空的字典:
a = dict.fromkeys(["name", "age", "job"])
print(a) # {'name': None, 'age': None, 'job': None}
字典元素的访问
- 通过“键”获得值,若键不存在,则抛出异常。
a = {"name": "小明", "age": 18, "job": "programmer"}
print(a["age"]) # 18
print(a["sex"]) # KeyError: 'sex'
- 通过 get() 方法获得值,推荐使用。优点是,指定键不存在,返回None(不报错),也可以设定指定键不存在时默认的返回对象。
a = {"name": "小明", "age": 18, "job": "programmer"}
print(a.get("job")) # programmer
print(a.get("sex", "男")) # 男
- 列出所有的键值对( a.items() ):
a = {"name": "小明", "age": 18, "job": "programmer"}
print(a.items())
# dict_items([('name', '小明'), ('age', 18), ('job', 'programmer')])
- 分别列出键和值:
a = {"name": "小明", "age": 18, "job": "programmer"}
print(a.keys()) # dict_keys(['name', 'age', 'job'])
print(a.values()) # dict_values(['小明', 18, 'programmer'])
- len() 键值对个数
a = {"name": "小明", "age": 18, "job": "programmer"}
print(len(a)) # 3
- 检测一个键是否在字典中 in
a = {"name": "小明", "age": 18, "job": "programmer"}
print("name" in a) # True
字典元素的添加、修改、删除
- 字典新增键值对。若“键”已存在,则覆盖旧的键值对;若“键”不存在,则新增键值对。
a = {"name": "小明", "age": 18, "job": "programmer"}
a["sex"] = "男"
print(a) # {'name': '小明', 'age': 18, 'job': 'programmer', 'sex': '男'}
- 使用 update() 将新字典中所有键值对全部添加到旧字典对象中。如果key有重复,则直接覆盖。
a = {"name": "小明", "age": 18, "job": "programmer"}
b = {"name": "小张", "address": "清华园"}
a.update(b)
print(a) # {'name': '小张', 'age': 18, 'job': 'programmer', 'address': '清华园'}
- 字典中元素的删除。
可以使用 del() 方法:
a = {"name": "小明", "age": 18, "job": "programmer"}
del(a["name"])
print(a) # {'age': 18, 'job': 'programmer'}
a = {"name": "小明", "age": 18, "job": "programmer"}
del(a)
print(a) # NameError: name 'a' is not defined
clear() 删除所有的键值对:
a = {"name": "小明", "age": 18, "job": "programmer"}
a.clear()
print(a) # {}
pop() 删除指定键值对,并返回相应的值对象。
a = {"name": "小明", "age": 18, "job": "programmer"}
b = a.pop("age")
print(b) # 18
- popitem() :随机删除和返回该键值对。字典是无序可变序列,因此没有第一个元素、最后一个元素的概念;popitem 弹出随机的项,因为字典中并没有顺序的概念。若想一个接一个的移除并处理项,这个方法就非常有效(因为不用先获取键的列表)。
a = {"name": "小明", "age": 18, "job": "programmer"}
for i in a.keys():
print(a[i])
# 小明
# 18
# programmer
for i in range(len(a)):
print(a.popitem())
# ('job', 'programmer')
# ('age', 18)
# ('name', '小明')
序列解包
序列解包可以用于列表、元组和字典,以便方便的对多个变量赋值。
x, y, z = (10, 20, 30)
print(y) # 20
a, b, c = [11, 22, 33]
print(a) # 11
序列解包用于字典时,默认是对“键”进行操作;如果需要对键值进行操作,则需要使用 items();如果需要对值进行操作,需要使用values()。
a = {"name": "小明", "age": 18, "job": "programmer"}
x, y, z = a
print(y) # age 默认只对键进行操作
x, y, z = a.items()
print(y) # ('age', 18)
a = {"name": "小明", "age": 18, "job": "programmer"}
x, y, z = a.values()
print(y) # 18
案例
表格数据使用字典和列表存储,并实现访问。
r1 = {"name": "高小一", "age": 18, "salary": 30000}
r2 = {"name": "高小二", "age": 19, "salary": 20000}
r3 = {"name": "高小五", "age": 20, "salary": 10000}
tb = [r1, r2, r3]
# 获得第二行人的薪资
print(tb[1].get("salary")) # 20000
# 打印列表中所有人的薪资
for i in range(len(tb)):
print(tb[i].get("salary"))
# 30000
# 20000
# 10000
字典核心底层原理
字典对象的核心是散列表。散列表是一个稀疏矩阵(总是有空白元素的数组),数组的每个单元叫bucket。每个bucket有两部分:一个是键对象的引用,一个是值对象的引用。由于所有bucket结构和大小一致,我们可以通过偏移量来读取指定bucket。
将一个键值对放进字典的底层过程