字典中的一个单元就是一个键值对 所以字典当中的都是成对出现的
“键值对”的无需可变列表,每个元素都是一个键值对 键值对由键对象和值对象组成
可以通过键实现快速获取删除更新对应的值
a = {'name':'Kyle','age':19,'job':'programmer'}
如上所示就是一个字典:前面的就是键对象 :后面的就是值对象
- 通过“键”来找对应的“值”
- 键 是任意不可变数据如:整数 浮点数 字符串 元组 并且键不可以重复 如:列表字典集合是属于可变的 所以不能作为键
- 值是任意的数据 并且可以重复
字典的创建
{} dict()创建
a = {'name':'Kyle','age':19,'job':'programmer'}
b = dict(name='Kyle',age=19,job='programmer')
c = dict([("name","Kyle"),("age",19),("job","programmer")]) # dict里包列表 列表包元组 这里的每一个元组就相当于一个键值对 这种情况用的比较少
d = {} # 创建了一个空的字典对象
e = dict() # 创建了一个空的字典对象
print(a)
print(b)
print(c)
print(d)
print(e)
# {'name': 'Kyle', 'age': 19, 'job': 'programmer'}
# {'name': 'Kyle', 'age': 19, 'job': 'programmer'}
# {'name': 'Kyle', 'age': 19, 'job': 'programmer'}
# {}
# {}
zip()创建
k = ['name','age','job']
v = ['Kyle',19,'programmer']
a = zip(k,v) # zip把列表对应位置的元素形成元组 然后生成一个zip对象
print(a)
# <zip object at 0x00000209A3613840>
print(dict(a)) # 这里运用zip其实遇上面那个dict里包列表 列表包元组类似
# {'name': 'Kyle', 'age': 19, 'job': 'programmer'}
fromkeys()创建
f = dict.fromkeys(['name','age','job']) # 这个方法只需要传入需要的键就可以 然后生成值是空的字典
print(f)
# {'name': None, 'age': None, 'job': None}
键不可以重复
m = {'age':19,'age':38}
print(m)
# {'age': 38} # 键重复后面的会把前面的覆盖 键不可以重复
字典元素的访问
[]来访问
a = {'name': 'Kyle', 'age': 19, 'job': 'programmer'}
b = a['name']
print(b) # 传键 如果不存在就会报错
get()访问 推荐
a = {'name': 'Kyle', 'age': 19, 'job': 'programmer'}
b = a.get('name')
c = a.get('gender','一个男人')
d = a.get('school')
print(b)
print(c)
print(d)
# Kyle
# 一个男人
# None
# 优点:指定键不存在就会返回None 并且可以设定指定键不存在的时候默认返回的对象
列出所有的键值对 所有键 所有值
a = {'name': 'Kyle', 'age': 19, 'job': 'programmer'}
b = a.items() # 返回所有键值对
print(b)
# dict_items([('name', 'Kyle'), ('age', 19), ('job', 'programmer')])
c = a.keys() # 返回所有键
d = a.values() # 返回所有值
print(c)
print(d)
# dict_keys(['name', 'age', 'job'])
# dict_values(['Kyle', 19, 'programmer'])
字典元素(键值对)的添加 修改 删除
新增
a = {'name': 'Kyle', 'age': 19, 'job': 'programmer'}
a['address'] = 'Earth' # 键不在新增
a['age'] = 16 # 键已在 则覆盖
print(a)
# {'name': 'Kyle', 'age': 16, 'job': 'programmer', 'address': 'Earth'}
update()
a = {'name': 'Kyle', 'age': 19, 'job': 'programmer'}
b = {'name':'Curry','money':100000,'gender':'男'}
a.update(b) # b中全部加至a中 如果重复了就覆盖
print(a)
# {'name': 'Curry', 'age': 19, 'job': 'programmer', 'money': 100000, 'gender': '男'}
删除
a = {'name': 'Kyle', 'age': 19, 'job': 'programmer'}
a.clear() # clear直接删除全部 所以a经过clear之后就变成了空的字典对象
print(a)
# {}
a = {'name': 'Kyle', 'age': 19, 'job': 'programmer'}
del(a['name']) # 删除一个
print(a)
# {'age': 19, 'job': 'programmer'}
nianling = a.pop('age') # 删除并返回值对象
print(a)
# {'job': 'programmer'}
print(nianling)
# 19
pipitem()随机删除
popitem()随机删除与返回该键值对
如果想一个接一个地移除并处理项 该方法有效 因为不用首先获取键的列表 字典无序可变 没有先后而言
a = {'name': 'Kyle', 'age': 19, 'job': 'programmer'}
a.popitem()
print(a)
a.popitem()
print(a)
# {'name': 'Kyle', 'age': 19}
# {'name': 'Kyle'}
序列解包
可以用于元组列表字典
x,y,z = 10,20,30
(a,b,c) = (9,8,0)
[m,n,p] = [10,20,30]
操作键 操作键值对 操作值
s = {'name': 'Kyle', 'age': 19, 'job': 'programmer'}
a,b,c = s # 默认是键进行序列解包 就相当于name age job这三个键分别对应abc
print(a)
# name
a,b,c = s.items() # 操作键值对
print(a)
# ('name', 'Kyle')
a,b,c = s.values() # 操作值
print(a)
# Kyle
表格数据使用字典核列表存储的访问
姓名 | 年龄 | 薪资 | 城市 |
张三 | 18 | 30000 | 深圳 |
李四 | 19 | 20000 | 北京 |
啊哈 | 19 | 50000 | 青岛 |
r1 = {'name':'张三','age':'18','salary':'30000','city':'深圳'}
r2 = {'name':'李四','age':'19','salary':'20000','city':'北京'}
r3 = {'name':'啊哈','age':'19','salary':'50000','city':'青岛'}
tb = [r1,r2,r3]
print(tb)
# [{'name': '张三', '年龄': '18', '薪资': '30000', '城市': '深圳'}, {'name': '李四', '年龄': '19', '薪资': '20000', '城市': '北京'}, {'name': '啊哈', '年龄': '19', '薪资': '50000', '城市': '青岛'}]
print(tb[2].get('salary'))
# 50000
下面是一些关于for循环的运用 后续会提及 先做一个了解
for i in range(3):
print(tb[i].get('salary'))
# 30000
# 20000
# 50000
for i in range(len(tb)):
print(tb[i].get('name'),tb[i].get('age'),tb[i].get('salary'),tb[i].get('city'))
# 张三 18 30000 深圳
# 李四 19 20000 北京
# 啊哈 19 50000 青岛
字典总结
- 在内存中开销巨大 典型的空间换时间 (稀疏矩阵嘛占得空间很大)
- 键查询速度很快
- 往字典里添加新的键值对可能导致扩容 导致散列表中键的次序变化 因为不要在遍历字典的同时进行字典的修改(读就是读 写就是写)
- 键必须可散列不可变 (数字 字符串 元组都是可散列的
如果想用自定义方法来做键,必须支持以下三点(后续会详细提及)
- 支持hash()函数
- 支持通过__eq__()方法检测相等性
- 若a==b为真,则hash(a)==hash(b)也为真