1.collections中的abc

  • MutableMapping是Mapping的子类
  • Mapping是Collection的子类
  • Collection是Sized,Iterable,Container的子类
  • dict被注册到MutableMapping中拥有了MutableMapping的方法,dict是鸭子类型,相当于MutableMapping的子类。

  1. from collections.abc import MutableMapping
  2.  
  3. # dict属于MutableMapping类型
  4.  
  5. a = {}
  6. print(isinstance(a, MutableMapping)) # True

2.dict的常见用法

  1. a = {"":{"a":"aa"},
  2. "":{"b":"bb"}}
  3.  
  4. # 清空字典
  5. a.clear()
  6.  
  7. # 浅拷贝字典 浅拷贝虽然可以正常赋值,但是如果 my_dopy_dict 中的值进行了改变,则 a 中的值也会进行对应的改变
  8. my_dopy_dict = a.copy()
  9.  
  10. # 深拷贝 深拷贝则是实实在在的在内存当中声明了一个新的变量
  11. import copy
  12. new_dict = copy.deepcopy(a)
  13.  
  14. # get函数 dict.get(要查找的key,如果没找到对应key的内容返回的数据)
  15. print(a.get("",{1:""})) # {1: '3'}
  16.  
  17. # dict.fromkeys() 函数用于创建一个新字典,以序列 seq 中元素做字典的键 seq可以是可迭代的,value 为字典所有键对应的初始值。
  18. my_list = [1, 2, 3]
  19. my_new_dict = dict.fromkeys(my_list, {"":""}) #{1: {'222': '3434'}, 2: {'222': '3434'}, 3: {'222': '3434'}}
  20.  
  21. # setdefault() 函数和 get()方法 类似,
  22. # 如果键不存在于字典中,将会添加键并将值设为默认值。
  23. # 如果存在,则将会返回该key对应的value
  24. a.setdefault("", "cc") # a= {'1': {'a': 'aa'}, '2': {'b': 'bb'}, '3': 'cc'}
  25. print(a.setdefault("", "cc")) # 返回{'b': 'bb'}
  26.  
  27. # update() 函数是合并两个字典:把字典dict2的键/值对更新到dict里。
  28. # 如果字典b中有与a相同的key,则会把a中的key对应的value进行更新
  29. # 如果字典b中有a中没有的key,则a会将未有的key与value添加进去
  30. b = {"": "cc", "": "dd"}
  31. a.update(b)
  32. print(a) # {'1': {'a': 'aa'}, '2': 'dd', '3': 'cc'}

3.dict的子类

  • 不可以去继承dict类,由于dict实现方式是C语言实现(没有重写方法的概念),所以重写dict中的方法是无效的
  • 可以去继承UserDict类,UserDict类是由python语言自己实现的可以重写
  • 我们也可以不去继承dict类而是去使用dict的子类defaultdict,由于defaultdict构造函数需要传入一个工厂所以我们传入dict来构造defaultdict
  1. class Mydict(dict):
  2. def __setitem__(self, key, value):
  3. super().__setitem__(key, value * 2)
  4.  
  5. my_dict = Mydict(one=1)
  6. print(my_dict) # {'one': 1} 不可以修改
  7. my_dict["one"] = 1
  8. print(my_dict) # {'one': 2} 可以像C语言一样修改
  1. from collections import UserDict
  2.  
  3. class Mydict(UserDict):
  4. def __setitem__(self, key, value):
  5. super().__setitem__(key, value * 5)
  6.  
  7. my_dict = Mydict(one=3)
  8. print(my_dict) # {'one': 15} 调用重写的__setitem__
  9. my_dict["one"] = 4
  10. print(my_dict) # {'one': 20} 调用重写的__setitem__
  1. from collections import defaultdict
  2.  
  3. my_dict = defaultdict(dict) # dict的子类
  4. print(my_dict["bobby"]) # {},不存在则返回{}
  5. pass

4.set和frozenset

  • set:无序,不重复,可修改集合
  • frozenset:无序,不重复,不可修改集合
  1. a = set('abcdee')
  2. a.add('f')
  3. print(a) # {'a', 'd', 'c', 'b', 'e', 'f'}
  4. another_set = set('defgh')
  5. # 添加数据
  6. a.update(another_set)
  7. print(a) # {'a', 'd', 'c', 'b', 'e', 'g', 'f', 'h'}
  8. # 集合的差集
  9. re_set = a.difference(another_set)
  10. # 减法实现于__ior__魔法函数
  11. re_set2 = a - another_set
  12. # 集合的交集&
  13. re_set3 = a & another_set
  14. # 集合的并集|
  15. re_set4 = a | another_set
  16. print(re_set) # {'c', 'a', 'b'}
  17. print(re_set2) # {'c', 'a', 'b'}
  18. print(re_set3) # {'d', 'e', 'g', 'f', 'h'}
  19. print(re_set4) # {'a', 'd', 'c', 'b', 'e', 'g', 'f', 'h'}
  20. # 也可以用if in判断(实现于__contains__魔法函数)
  21. if 'a' in re_set:
  22. print('a in re_set') # a in re_set

5.dict和set实现原理

  • set和dict的查询性能远远好于list
  • list会随数据量的增大而增大,set和dict不会

dist和set使用哈希表存储:

注意:

  1. dict的key以及set的value都必须是可以hash的
  2. 什么是可以hash:不可变对象:str,frozenset,tuple以及自己实现了__hash__的类
  3. dict的内存花销大,但查询速度快,自定义的对象或python内部的对象都是用dict包装的
  4. dict的存储顺序和元素添加顺序有关
  5. dict在添加数据时可能改变已有数据的顺序

第六章深入python的set和dict的更多相关文章

  1. 第六章:Python基础の反射与常用模块解密

    本课主题 反射 Mapping 介绍和操作实战 模块介绍和操作实战 random 模块 time 和 datetime 模块 logging 模块 sys 模块 os 模块 hashlib 模块 re ...

  2. 第十六章:Python の Web开发基础(三) jQuery与Ajax

    本課主題 jQuery 介绍 Ajax 介绍 jQuery 介绍 选择器 jQuery 的选择器分不同的种类,主要目的是用来查找目标的 HTML 标签,方便对目标标签进行操作,比如找到 <li& ...

  3. 《Python核心编程》 第六章 序列 - 课后习题

    课后习题 6–1.字符串.string 模块中是否有一种字符串方法或者函数可以帮我鉴定一下一个字符串是否是另一个大字符串的一部分? 答:成员关系操作符(in.not in) import string ...

  4. 简学Python第六章__class面向对象编程与异常处理

    Python第六章__class面向对象编程与异常处理 欢迎加入Linux_Python学习群  群号:478616847 目录: 面向对象的程序设计 类和对象 封装 继承与派生 多态与多态性 特性p ...

  5. Python 编程快速上手 第六章总结

    第六章 字符串操作 前言 这一章节讲了关于 Python 中字符串类型的知识.与字符串有关的操作符,方法等等. 处理字符串:字符串的写入.打印.访问的知识 原始字符串 格式:r'string'作用:在 ...

  6. 进击的Python【第十六章】:Web前端基础之jQuery

    进击的Python[第十六章]:Web前端基础之jQuery 一.什么是 jQuery ? jQuery是一个JavaScript函数库. jQuery是一个轻量级的"写的少,做的多&quo ...

  7. python 教程 第六章、 模块

    第六章. 模块 1) 模块 sys模块 字节编译的.pyc文件,优化编译后生成pyo文件 2) from..import语句 import sys print 'The command line ar ...

  8. Python第六章 面向对象

    第六章 面向对象 1.面向对象初了解 ​ 面向对象的优点: ​ 1.对相似功能的函数,同一个业务下的函数进行归类,分类 ​ 2.类是一个公共的模板,对象就是从具体的模板中实例化出来的,得到对象就得到一 ...

  9. Python编程:从入门到实践——【作业】——第六章(字典)

    第六章作业 6-1 人 : 使用一个字典来存储一个熟人的信息, 包括名. 姓. 年龄和居住的城市. 该字典应包含键first_name . last_name . age 和city . 将存储在该字 ...

随机推荐

  1. fiddler抓包-5-Composer功能进行接口测试

    前言 fiddler是个强大的抓接口工具,轻松看出接口的所有参数,这里介绍一个Composer功能它也可以进行接口测试,平时接口可能传参错误,我们可以拖拽接口来改参数直接再请求了,非常方便! 一.Co ...

  2. pkg_resources.DistributionNotFound: The 'pip==7.1.0' distribution was not found and is required by the application

    问题描述: Traceback (most recent call last): File "/usr/bin/pip", line 5, in <module> fr ...

  3. Prometheus 监控Docker服务器及Granfanna可视化

    Prometheus 监控Docker服务器及Granfanna可视化 cAdvisor(Container Advisor)用于收集正在运行的容器资源使用和性能信息. 使用Prometheus监控c ...

  4. Consider the following: If you want an embedded database (H2, HSQL or Der...

    这个坑把java进程干掉就可以了,因为占用了 Description: Failed to configure a DataSource: 'url' attribute is not specifi ...

  5. select2插件placeholder不显示的问题

    如果设置了select2的templateSelection,没做特殊处理的话placeholder会不显示,需要做特殊处理 templateSelection: function(repo){ if ...

  6. 后台数据转换成Excel,前台下载

    <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactI ...

  7. Flask配置方式

    目录 Flask配置方式 默认的配置参数 Flask配置方式 flask配置总共有四种方式: 第一种:直接在启动文件中进行配置 from flask import Flask app = Flask( ...

  8. 配置Java,jdk环境变量

    注意:所有的都是配系统变量 变量名:JAVA_HOME 变量值:D:\Program Files\Java\jdk1.8.0_202(以自己的为准)变量名:Path 变量值:%JAVA_HOME%\b ...

  9. FCC-学习笔记 DNA Pairing

    FCC-学习笔记  DNA Pairing 1>最近在学习和练习FCC的题目.这个真的比较的好,推荐给大家. 2>中文版的地址:https://www.freecodecamp.cn/;英 ...

  10. Qt Examples - Boxes (在Qt场景视图中结合OpenGL渲染)

    QT自带例程Boxes使用QT Graphics View框架实现了2D图形和3D图形的混合渲染,综合性比较强,整合知识较多,值得学习. 可以使用鼠标通过以下方式控制演示中的元素: 按住鼠标左键的同时 ...