python基础---字典

字典

  1. 字典是“键值对”的无序可变序列,字典中的每一个元素都是一个键值对,包含键对象和值对象。可以通过键对象实现快速获取、删除、更新对应的值对象。
  2. 字典中的**“键”**是任意的不可变数据,如:整数、浮点数、字符串、元组且键具有唯一性(不可重复);而字典中的“值”可以是任意数据,并且可重复。

字典的创建

  1. 可通过{}、dict() 来创建字典对象:
a = {"name": "小明", "age": 18, "job": "programmer"}

b = dict(name = "xiaoming", age = 18, job = "programmer")

c = dict([("name", "xiaoming"), ("age", 18)])

# 创建空的字典对象
e = {}
f = dict()
  1. 通过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对象。

  1. 通过 dict.fromkeys() 创建值为空的字典:
a = dict.fromkeys(["name", "age", "job"])
print(a)  # {'name': None, 'age': None, 'job': None}

字典元素的访问

  1. 通过“键”获得值,若键不存在,则抛出异常
a = {"name": "小明", "age": 18, "job": "programmer"}
print(a["age"])  # 18

print(a["sex"])  # KeyError: 'sex'
  1. 通过 get() 方法获得值,推荐使用。优点是,指定键不存在,返回None(不报错),也可以设定指定键不存在时默认的返回对象。
a = {"name": "小明", "age": 18, "job": "programmer"}
print(a.get("job"))  # programmer
print(a.get("sex", "男"))  # 男
  1. 列出所有的键值对( a.items() ):
a = {"name": "小明", "age": 18, "job": "programmer"}
print(a.items())
# dict_items([('name', '小明'), ('age', 18), ('job', 'programmer')])
  1. 分别列出键和值:
a = {"name": "小明", "age": 18, "job": "programmer"}
print(a.keys())  # dict_keys(['name', 'age', 'job'])
print(a.values())  # dict_values(['小明', 18, 'programmer'])
  1. len() 键值对个数
a = {"name": "小明", "age": 18, "job": "programmer"}
print(len(a))  # 3
  1. 检测一个是否在字典中 in
a = {"name": "小明", "age": 18, "job": "programmer"}
print("name" in  a)  # True

字典元素的添加、修改、删除

  1. 字典新增键值对。若“键”已存在,则覆盖旧的键值对;若“键”不存在,则新增键值对。
a = {"name": "小明", "age": 18, "job": "programmer"}
a["sex"] = "男"
print(a)  # {'name': '小明', 'age': 18, 'job': 'programmer', 'sex': '男'}
  1. 使用 update()新字典中所有键值对全部添加到旧字典对象中。如果key有重复,则直接覆盖。
a = {"name": "小明", "age": 18, "job": "programmer"}
b = {"name": "小张", "address": "清华园"}
a.update(b)
print(a)  # {'name': '小张', 'age': 18, 'job': 'programmer', 'address': '清华园'}
  1. 字典中元素的删除。
    可以使用 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
  1. 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。
在这里插入图片描述

将一个键值对放进字典的底层过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

根据键查找键值对的底层过程

在这里插入图片描述

总结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值