第六章深入python的set和dict
1.collections中的abc
- MutableMapping是Mapping的子类
- Mapping是Collection的子类
- Collection是Sized,Iterable,Container的子类
- dict被注册到MutableMapping中拥有了MutableMapping的方法,dict是鸭子类型,相当于MutableMapping的子类。




from collections.abc import MutableMapping
# dict属于MutableMapping类型
a = {}
print(isinstance(a, MutableMapping)) # True
2.dict的常见用法
a = {"":{"a":"aa"},
"":{"b":"bb"}}
# 清空字典
a.clear()
# 浅拷贝字典 浅拷贝虽然可以正常赋值,但是如果 my_dopy_dict 中的值进行了改变,则 a 中的值也会进行对应的改变
my_dopy_dict = a.copy()
# 深拷贝 深拷贝则是实实在在的在内存当中声明了一个新的变量
import copy
new_dict = copy.deepcopy(a)
# get函数 dict.get(要查找的key,如果没找到对应key的内容返回的数据)
print(a.get("",{1:""})) # {1: '3'}
# dict.fromkeys() 函数用于创建一个新字典,以序列 seq 中元素做字典的键 seq可以是可迭代的,value 为字典所有键对应的初始值。
my_list = [1, 2, 3]
my_new_dict = dict.fromkeys(my_list, {"":""}) #{1: {'222': '3434'}, 2: {'222': '3434'}, 3: {'222': '3434'}}
# setdefault() 函数和 get()方法 类似,
# 如果键不存在于字典中,将会添加键并将值设为默认值。
# 如果存在,则将会返回该key对应的value
a.setdefault("", "cc") # a= {'1': {'a': 'aa'}, '2': {'b': 'bb'}, '3': 'cc'}
print(a.setdefault("", "cc")) # 返回{'b': 'bb'}
# update() 函数是合并两个字典:把字典dict2的键/值对更新到dict里。
# 如果字典b中有与a相同的key,则会把a中的key对应的value进行更新
# 如果字典b中有a中没有的key,则a会将未有的key与value添加进去
b = {"": "cc", "": "dd"}
a.update(b)
print(a) # {'1': {'a': 'aa'}, '2': 'dd', '3': 'cc'}
3.dict的子类
- 不可以去继承dict类,由于dict实现方式是C语言实现(没有重写方法的概念),所以重写dict中的方法是无效的
- 可以去继承UserDict类,UserDict类是由python语言自己实现的可以重写
- 我们也可以不去继承dict类而是去使用dict的子类defaultdict,由于defaultdict构造函数需要传入一个工厂所以我们传入dict来构造defaultdict
class Mydict(dict):
def __setitem__(self, key, value):
super().__setitem__(key, value * 2) my_dict = Mydict(one=1)
print(my_dict) # {'one': 1} 不可以修改
my_dict["one"] = 1
print(my_dict) # {'one': 2} 可以像C语言一样修改
from collections import UserDict class Mydict(UserDict):
def __setitem__(self, key, value):
super().__setitem__(key, value * 5) my_dict = Mydict(one=3)
print(my_dict) # {'one': 15} 调用重写的__setitem__
my_dict["one"] = 4
print(my_dict) # {'one': 20} 调用重写的__setitem__
from collections import defaultdict my_dict = defaultdict(dict) # dict的子类
print(my_dict["bobby"]) # {},不存在则返回{}
pass
4.set和frozenset
- set:无序,不重复,可修改集合
- frozenset:无序,不重复,不可修改集合
a = set('abcdee')
a.add('f')
print(a) # {'a', 'd', 'c', 'b', 'e', 'f'}
another_set = set('defgh')
# 添加数据
a.update(another_set)
print(a) # {'a', 'd', 'c', 'b', 'e', 'g', 'f', 'h'}
# 集合的差集
re_set = a.difference(another_set)
# 减法实现于__ior__魔法函数
re_set2 = a - another_set
# 集合的交集&
re_set3 = a & another_set
# 集合的并集|
re_set4 = a | another_set
print(re_set) # {'c', 'a', 'b'}
print(re_set2) # {'c', 'a', 'b'}
print(re_set3) # {'d', 'e', 'g', 'f', 'h'}
print(re_set4) # {'a', 'd', 'c', 'b', 'e', 'g', 'f', 'h'}
# 也可以用if in判断(实现于__contains__魔法函数)
if 'a' in re_set:
print('a in re_set') # a in re_set
5.dict和set实现原理
- set和dict的查询性能远远好于list
- list会随数据量的增大而增大,set和dict不会
dist和set使用哈希表存储:

注意:
- dict的key以及set的value都必须是可以hash的
- 什么是可以hash:不可变对象:str,frozenset,tuple以及自己实现了__hash__的类
- dict的内存花销大,但查询速度快,自定义的对象或python内部的对象都是用dict包装的
- dict的存储顺序和元素添加顺序有关
- dict在添加数据时可能改变已有数据的顺序
第六章深入python的set和dict的更多相关文章
- 第六章:Python基础の反射与常用模块解密
本课主题 反射 Mapping 介绍和操作实战 模块介绍和操作实战 random 模块 time 和 datetime 模块 logging 模块 sys 模块 os 模块 hashlib 模块 re ...
- 第十六章:Python の Web开发基础(三) jQuery与Ajax
本課主題 jQuery 介绍 Ajax 介绍 jQuery 介绍 选择器 jQuery 的选择器分不同的种类,主要目的是用来查找目标的 HTML 标签,方便对目标标签进行操作,比如找到 <li& ...
- 《Python核心编程》 第六章 序列 - 课后习题
课后习题 6–1.字符串.string 模块中是否有一种字符串方法或者函数可以帮我鉴定一下一个字符串是否是另一个大字符串的一部分? 答:成员关系操作符(in.not in) import string ...
- 简学Python第六章__class面向对象编程与异常处理
Python第六章__class面向对象编程与异常处理 欢迎加入Linux_Python学习群 群号:478616847 目录: 面向对象的程序设计 类和对象 封装 继承与派生 多态与多态性 特性p ...
- Python 编程快速上手 第六章总结
第六章 字符串操作 前言 这一章节讲了关于 Python 中字符串类型的知识.与字符串有关的操作符,方法等等. 处理字符串:字符串的写入.打印.访问的知识 原始字符串 格式:r'string'作用:在 ...
- 进击的Python【第十六章】:Web前端基础之jQuery
进击的Python[第十六章]:Web前端基础之jQuery 一.什么是 jQuery ? jQuery是一个JavaScript函数库. jQuery是一个轻量级的"写的少,做的多&quo ...
- python 教程 第六章、 模块
第六章. 模块 1) 模块 sys模块 字节编译的.pyc文件,优化编译后生成pyo文件 2) from..import语句 import sys print 'The command line ar ...
- Python第六章 面向对象
第六章 面向对象 1.面向对象初了解 面向对象的优点: 1.对相似功能的函数,同一个业务下的函数进行归类,分类 2.类是一个公共的模板,对象就是从具体的模板中实例化出来的,得到对象就得到一 ...
- Python编程:从入门到实践——【作业】——第六章(字典)
第六章作业 6-1 人 : 使用一个字典来存储一个熟人的信息, 包括名. 姓. 年龄和居住的城市. 该字典应包含键first_name . last_name . age 和city . 将存储在该字 ...
随机推荐
- Java奇妙之旅day_01
一 .java程序运行原理 1.首先我们下载JDK,它是一组命令行工具,含有编译.调试.和执行java程序所需要的软件和工具. (1)关于下载我们在这不作赘述,在Oracle官方网站直接下载,一直点击 ...
- SQL --------------- order by 排序
首先创建一个表弄点数据 order by 关键字用于排序查询 默认按照升序(asc)进行排列 降序要使用 desc排序方式:数字按照大小 英文字母和汉字按照第一个字母 从 a-z 排列语 法: ...
- vue组件、自定义指令、路由
1.vue组件 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的 ...
- Appium+python自动化(四)- 如何查看程序所占端口号和IP(超详解)(番外篇)
简介 这篇博文和分类看似没有多大关系,但是也是从上一篇衍生出来的产物,因为涉及到FQ工具Lantern,就算是给关注和支持的小伙伴们拓展一下眼界和知识面.而且好多人都阅读了上一篇没发现那个参考博客点不 ...
- Java中Deque特性及API
美人如斯,文章如斯! 定义 双向队列:支持插入删除元素的线性集合 特性: 插入.删除.获取操作支持两种形式:快速失败和返回null或true/false 既具有FIFO特点又具有LIFO特点,即是队列 ...
- uni-app如何解决在for循环里调用异步请求获取数据顺序混乱问题?
总结/朱季谦 先前有一次做uni-app的js接口对接时,遇到过这样的情况,在for循环里,调用一个异步请求时,返回来的值顺序是乱的,因此,在以下的代码里,push到数组里的值,每次的顺序可能都是不一 ...
- 2019-11-29-浅谈-Windows-桌面端触摸架构演进
原文:2019-11-29-浅谈-Windows-桌面端触摸架构演进 title author date CreateTime categories 浅谈 Windows 桌面端触摸架构演进 lind ...
- Form之action提交不刷新不跳转
<div class="file-box"> <form action="/File/fileUpLoad" id="form1&q ...
- MySQL中的存储过程、游标和存储函数
MySQL中的存储过程首先来看两个问题: 1.什么是存储过程? 存储过程(Stored Procedure)是在数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存 ...
- UUID生成库libuuid和crossguid
libuuid是一个开源的用于生成UUID(Universally Unique Identifier,通用唯一标识符)的库. 可从https://sourceforge.net/projects/l ...