# 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
py语法基础013_字典操作介绍
最新推荐文章于 2024-05-09 20:43:47 发布