py语法基础013_字典操作介绍

# encoding=utf-8
"""

四、字典操作
1、定义:是一个元素以大括号包围,呈键值对格式,以逗号分隔的,无序的,可以修改的序列
(1)以键值对格式的数据保存的数据类型是字典(dict),是唯一内建的映射类型
(2)变量值的数据结构成为映射(mapping),可以通过变量名引用变量值
(3)一般变量名称为键(key),变量值称为值(value),整体称之为键值对
(4)字典的key是不可变数据,不可以重复;value可以是任意数据类型,可以重复
(5)将数据的类型和数据的值一同存放映射在一个容器中,使之按照一定的对应的规则建立关系
(6)可以通过一边的数据唯一确定另一边的数据(哈希算法)的容器
2、键值对
(1)字典以键值对的方式存放数据key-value
(2)字典的键只能是不可变数据类型,是惟一的,多个键不能重复,否则只会保留最后的键值
(3)字典的值可以是任意数据类型,可以重复
(4)字典不是序列,但是可以进行赋值和遍历--注意,只会拿到键,拿不到值
3、字典(dict)
是键值对的无序可变序列
(1)是内置的基础数据结构之一
(2)是一组无序的键值对的组合
(3)容器中存储的是成对的数据
(4)是唯一一种映射关系的数据类型
(5)强调个体,记录个体的多个特征
4、创建
(1)创建空字典:dct={} | dct=dict()
(2)创建多个数值的字典:dct={"键1":"值1","键2":"值2"}  |  dct = dict([("键1","值1"),("键2","值2")])
(3)zip创建:dct = zip(["键1","键2"],["值1","值2"])
(4)fromkeys创建(值为空):dct = dict.fromkeys(["键1","键2"])
5、特点
(1)字典是无序的,没有索引,只能以键取值
(2)字典的key(键)必须是不可变的数据类型
(3)字典的value(值)可以是任意的数据类型
(4)字典是可变的数据类型
6、应用场景:保存一些事物的多个信息
7、增加操作
(1)dct[key]=value:键不存在,则增加键值对;key存在,则更新数据
(2)dct.setdefault(key,value):键不存在,则增加键值对;key存在,则不操作
(3)dct.copy():浅拷贝,拷贝字典给新变量
(4)dct.update(dct2):将新字典的所有键值添加到原字典中,相同键则覆盖更新
8、修改操作
(1)dct[key]=value:通过key添加value值,如果key存在则覆盖
(2)dct.update(dict)将后面的字典合并到前面字典中,相同键覆盖,不同键增添
9、查询操作
(1)dct[key]:通过键查值,查询指定key对应的值;若key不存在,则抛出异常
(2)dct.keys():获取字典所有的键,可迭代
(3)dct.values():获取字典所有的值,可迭代
(4)dct.items():获取字典中的所有键值对,遍历以元组的形式展示
(5)dct.get(key,无键返回值):获取指定键的值;若无键,可设置无键返回值,默认为None
(6)dct.update(dict):以字典格式更新指定键的内容,键不存在,创建键和值
(7)len(dct):获取字典中数据的个数
(8)in:判断指定的键在字典中【数据 in dct】
(9)for循环遍历:通过循环的方式可以在字典中、keys方法、values方法、items方法中获取各个值
10、删除操作
(1)dct.pop(key):弹出key对应的字典值
(2)dct.popitem():随机弹出字典中的一个键值对,以元组形式返回对应的键值对
(3)clear():清空字典,只剩空字典
(4)del dct[key]:删除字典的指定键的键值对
(5)del dct[key]:删除整个字典变量

zip(lst1,lst2...):将多个列表对应位置的元素合成元组,半凝固返回一个zip对象
生成器
表达式与列表推导式形式类似,会生成一个生成器对象
一个生成器对象中的各个元素都只能使用一次,再次使用就空了

字典核心底层原理
(1)字典对象的核心是散列表
(2)散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做bucket
(3)每个bucket有两部分:一个是键对象的引用,一个是值对象的引用
(4)所有bucket结构和大小一致,可以通过偏移量来读取指定bucket

字典存储键值对底层过程
>> 字典对象a创建完后,数组长度为8,把name=duxun放到字典中
计算键name的散列值:bin(hash("name"))='-0b1010111101001110110101100100101'
确定数组长度为8,转换成二进制为"1000",则可使用3位二进制数字表示
拿计算出的散列值的最右边3位数字"101"作为偏移量,即5
查看偏移量5对应的bucket是否为空,为空则将键值对放进去
不为空则再取偏移量为4对应的bucket判断,直到找到为空的bucket将键值对放进去
若一直找不到,python将对散列表进行扩容

根据键查找"键值对"的底层过程
调用a.get("name"),根据键"name"查找到"键值对",从而找到值对象"duxun"
计算键name的散列值:bin(hash("name"))='-0b1010111101001110110101100100101'
确定数组长度为8,转换成二进制为"1000",则可使用3位二进制数字表示
拿计算出的散列值的最右边3位数字"101"作为偏移量,即5
查看偏移量5,对应的bucket是否为空:如果为空,则返回None
如果不为空,则计算bucket的键对象的散列值,和已有散列值进行比较,如果相等,则将对应"值对象"返回
如果不相等,则再依次取其他几位数字,重新计算偏移量
依次取完后,仍然没有找到,则返回None



用法总结:
1.键必须可散列
(1)数字、字符串、元组,都是可散列的。
(2)自定义对象需要支持下面三点:
①支持hash()函数
②支持通过__eq__()方法检测相等性。
③若a==b为真,则hash(a)==hash(b)也为真。
2.字典在内存中开销巨大,典型的空间换时间。
3.键查询速度很快
4.往字典里面添加新建可能导致扩容,导致散列表中键的次序变化。不能在遍历字典的同时进行修改

"""

print("------------声明空字典------------")
dict1 = {}
print("创建空字典:",dict1,type(dict1))
dict2 = dict()
print("创建空字典:",dict2,type(dict2))

print("------------声明非空字典------------")
dict3 = {"name": "宣墨", "age": 24, "gender": "女", "password": "111"}
print("创建非空字典:",dict3,type(dict3))
dict4 = dict3.copy()
print("创建非空字典:",dict4,type(dict4))
# 接收一个字典作为参数
dict5 = dict({"姓名": "李小花", "年龄": 18})
print("接收字典作为参数,创建字典:",dict5)
# 接收列表套元组的数据结构--一个元组就是一个键值对
dict6 = dict([("姓名", "李小花"),("年龄", 18)])
print("接收元组数据作为参数,创建字典:",dict6)
# 接收关键字参数
dict7 = dict(name="李小花", age=18)
print("接收关键字作为参数,创建字典:",dict7)

print("------------增加数据------------")
print("原字典:",dict7)
dict8 = dict7.copy()
print("copy复制字典:",dict8)
print("dct[key]=value:键不存在,则增加键值对;key存在,则更新数据")
dict8["status"] = "在售"
print(f"增加一个status-在售键值对:{dict8}")
print("dct.setdefault(key,value):键不存在,则增加键值对;key存在,则不操作")
dict8.setdefault("date", 10)
print(f"增加一个date-10键值对:{dict8}")
dict8.setdefault("status", "售罄")
print(f"修改一个status-售罄键值对:{dict8}")
dict8.update({"nickname":"杜迅","sex":"male"})
print("update在key不存在时增加键值对:",dict8)

print("------------修改数据------------")
print("dct[key]=value:通过key添加value值,如果key存在则覆盖")
dict8["nickname"] = "xunxun"
print("D[key]在key存在时修改键值对:",dict8)
print("dct.update(dict)将后面的字典合并到前面字典中,相同键覆盖,不同键增添")
dict8.update({"sex":"男"})
print("update在key存在时修改键值对:",dict8)
print("dct.setdefault(key,value):键不存在,则增加键值对;key存在,则不操作")
dict8.setdefault("name","杜迅")
print("setdefault在key存在时不做修改:",dict8)

print("------------查询数据------------")
print("dct.items():获取字典中的所有键值对,可迭代,遍历以元组的形式展示")
print("items获取所有键值对:",dict8.items())
print("遍历items获取各个键值对:")
for key, value in dict8.items():
    print(f"{key}>>>>>>{value}")
print("dct.keys():获取字典所有的键,返回的是字典键类型,可迭代,可通过list强制转换成列表类型")
print("keys获取所有的keys数据:",dict8.keys(),"dct.keys()的类型:",type(dict8.keys()))
print("dct.values():获取字典所有的值,可迭代")
print("values获取所有的values数据:",dict8.values(),"dct.values()的类型:",type(dict8.values()))
print("dct.get(key,设置无键返回值)获取指定键的value,若无键,则返回None,可设置无键返回值")
print("get获取key对应的value数据:",dict8.get("name"))
print("get获取key对应的value数据,无key时:",dict8.get("myName","没有此键值对"))
print("通过键查值:dct[key]查询指定key对应的值")
print("D['key']:获取key对应的value数据:",dict8["nickname"])

print("------------删除数据------------")
# pop(key)删除key对应的键值对,返回对应的值
print("dct.pop(key):删除key对应的键值对,返回对应的值")
print(f"弹出key对应的字典值:{dict8.pop('status')},弹出key对应的键值对:{dict8}")
print("pop删除key对应的键值对:",dict8)
del dict8["nickname"]
print("D[key]删除key对应的键值对:",dict8)
# dct.popitem()从后往前删除字典中的一个键值对,返回对应的键值对
print("dct.popitem():删除字典中的最后一个键值对,以元组形式返回对应的键值对")
print(f"删除最后一个键值对:{dict8.popitem()},删除键值对后的字典:{dict8}")
print("clear清空字典,只剩空字典:",dict8)
print("del会删除字典变量")
del dict8
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值