python中的字典

字典中的一个单元就是一个键值对 所以字典当中的都是成对出现的

“键值对”的无需可变列表,每个元素都是一个键值对 键值对由键对象和值对象组成

可以通过键实现快速获取删除更新对应的值

a = {'name':'Kyle','age':19,'job':'programmer'}

 如上所示就是一个字典:前面的就是键对象 :后面的就是值对象

  1. 通过“键”来找对应的“值”
  2. 键 是任意不可变数据如:整数 浮点数 字符串 元组 并且键不可以重复 如:列表字典集合是属于可变的 所以不能作为键
  3. 值是任意的数据 并且可以重复 

字典的创建

{} 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

 表格数据使用字典核列表存储的访问

姓名年龄薪资城市
张三1830000深圳
李四1920000北京
啊哈1950000青岛

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 青岛

字典总结

  • 在内存中开销巨大 典型的空间换时间 (稀疏矩阵嘛占得空间很大)
  • 键查询速度很快
  • 往字典里添加新的键值对可能导致扩容 导致散列表中键的次序变化 因为不要在遍历字典的同时进行字典的修改(读就是读 写就是写)
  • 键必须可散列不可变 (数字 字符串 元组都是可散列的

如果想用自定义方法来做键,必须支持以下三点(后续会详细提及)

  1. 支持hash()函数
  2. 支持通过__eq__()方法检测相等性
  3. 若a==b为真,则hash(a)==hash(b)也为真

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值