一、深入python的set和dict

1.1、dict的abc继承关系

from collections.abc import Mapping,MutableMapping
#dict属于mapping类型
a = {} #字典a不是继承MutableMapping,而是实现了MutableMapping的魔法函数
print(isinstance(a,MutableMapping)) #True

1.2、dict的常用方法

a = {"lishuntao":{"company":"hut"},
"lishuntao1":{"company":"hut1"}
}
#clear
# a.clear()
# print(a) #{} #copy,返回浅拷贝
# new_dict = a.copy()
# new_dict["lishuntao"]["company"] = "HUT" #new_dict拷贝出"lishuntao"与"lishuntao1"这是浅拷贝,
# # 第二层的dict也就是数据结构没有被拷贝出来,因此值会变动。
# print(new_dict) #{'lishuntao': {'company': 'HUT'}, 'lishuntao1': {'company': 'hut1'}}
# print(a) #{'lishuntao': {'company': 'HUT'}, 'lishuntao1': {'company': 'hut1'}} #深拷贝
import copy
new_dict = copy.deepcopy(a)
new_dict["lishuntao"]["company"] = "HUT"
print(a) #{'lishuntao': {'company': 'hut'}, 'lishuntao1': {'company': 'hut1'}}
print(new_dict) #{'lishuntao': {'company': 'HUT'}, 'lishuntao1': {'company': 'hut1'}} #fromkeys 将可迭代的对象转换为dict
new_list = ["li","li1","li2"]
new_dict = dict.fromkeys(new_list,{"company":"hut"})
print(new_dict) #{'li': {'company': 'hut'}, 'li1': {'company': 'hut'}, 'li2': {'company': 'hut'}} #get #如果没有这个键不会抛异常
value = a.get("lishuntao111",{})
print(value) #{} #items()
for key,value in a.items():
print(key,value) #lishuntao {'company': 'hut'},lishuntao1 {'company': 'hut1'} #setdefault
new_dict = a.setdefault("litao","hugongda")
print(new_dict) #hugongda
print(a) #{'lishuntao': {'company': 'hut'}, 'lishuntao1': {'company': 'hut1'}, 'litao': 'hugongda'} #update #可迭代的对象
#a.update([("lishun","tao"),("li110","hu")])
a.update(lishun='tao',li110="hu")#一样的效果

1.3、dict的子类

# #不建议继承dict和list
# class Mydict(dict):
# def __setitem__(self, key, value):
# super(Mydict, self).__setitem__(key,value*2)
#
# my_dict = Mydict(one=1)
# print(my_dict) #{'one': 1}
# my_dict["one"] = 1 #{'one': 2}
# print(my_dict)
# """
# 在某些情况下,用C语言写出来的python内置类型,它不会调用__setitem__方法
# 因此我们想要继承dict的话,就去继承UserDict(例如下面)
# """
from collections import UserDict
#
#
# class Mydict1(UserDict):
# def __setitem__(self, key, value):
# super(Mydict1, self).__setitem__(key,value*2)
#
# my_dict = Mydict1(one=1)
# print(my_dict) #{'one': 2}
# my_dict["one"] = 1 #{'one': 2}
# print(my_dict) from collections import defaultdict
"""
defaultdict重写了__missing__方法
"""
my_dict = defaultdict(dict)
my_value = my_dict["lishun"] #按照正常情况会报错误
print(my_value) #{} my_dict1 = {}
my_value1 = my_dict1["lishun"]
print(my_value1) #KeyError: 'lishun'

1.4、set和frozenset

#set 集合  frozenset 不可变集合   无序、不重复
s = set("abcde")
s.add("u")
print(s)#{'b', 'a', 'e', 'd', 'c', 'u'} s2 = frozenset("abcdef") #frozenset 可以作为dict的key
print(s2) #frozenset({'b', 'f', 'a', 'e', 'd', 'c'}) #不能修改 #difference
anoth_set = set("cdefgh")
res = s.difference(anoth_set)
print(res) #{'a', 'b', 'u'} #集合运算 交 并 差集
res = s - anoth_set
res1 = s & anoth_set #交
res2 = s | anoth_set #并
#set性能高 #实现__contains__魔法函数就可以做if判断

1.5、dict和set的实现原理

  dictlist查找元素,dict查找的性能远远大于list,在list中随着list数据的增大查找时间增大,在dict中查找元素不会随着数据的增大而增大,dict的实现原理叫做哈希表。哈希表的存储逻辑,哈希表的右边是数值的存储结构,是连续的数组,这个数组里存了指向keyvalue的指针。

哈希表的查找:首先计算dict的键的hash值,然后利用hash值定位数组中的一个表元,此时判断表元是否为空,如果表元为空,直接抛出KeyError,如果表元不为空,则判断键是否相等,如果相等的话返回表元里的值,如果不相等的话,则使用hash值的另一部分来定位hash表的另一行,然后又判断表元是否为空进入下一次判断循环。

 特性:

  1、dictkey或者set的值都必须是可以hash的(不可变对象,都是可以hash,str,frozenset,tuple,自己实现的类__hash__都是可以hash的)

  2、dict的内存花销大,但是查询速度快,自定义的对象或者python内部的对象都是用dict包装的

  3、dict的存储顺序和元素添加顺序有关

  4、添加数据有可能改变已有的数据的顺序

05-深入python的set和dict的更多相关文章

  1. day 05 万恶之源-基本数据类型(dict)

    05. 万恶之源-基本数据类型(dict)本节主要内容:1. 字典的简单介绍2. 字典增删改查和其他操作3. 字典的嵌套⼀一. 字典的简单介绍字典(dict)是python中唯⼀一的⼀一个映射类型.他 ...

  2. python基础之字典dict和集合set

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7043642.html python基础之字典dict和集合set 字典dic ...

  3. python入门14 字典dict

    字典dict是无序的key:value格式的数据序列 #coding:utf-8 #/usr/bin/python """ 2018-11-11 dinghanhua 字 ...

  4. Python基础——字典(dict)

    由键-值对构建的集合. 创建 dic1={} type(dic1) dic2=dict() type(dic2) 初始化 dic2={'hello':123,'world':456,'python': ...

  5. python何时用list,dict,set

    从读取的角度来讲: 看是用来随机读取(查询)还是连续读取. list数组集中存放,连续读取效率高(具体还没测试,理论上应该如此). dict散列表,使用hash计算存放的位置,随机读取效率高. 随机读 ...

  6. Python中list,tuple,dict,set的区别和用法

    Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, tuple, dict, set.这里对他们进行一个简明的总结. List ...

  7. python日常-list and dict

    什么是list: list 觉得算是python日常编程中用的最多的python自带的数据结构了.但是python重的list跟其他语言中的并不相同. 少年..不知道你听说过python中的appen ...

  8. Python~list,tuple^_^dict,set

    tuple~(小括号) list~[中括号] 和list比较,dict有以下几个特点: dict~{‘key’:value,} set~set([1,2,3]) tuple一旦初始化就不能修改~指向不 ...

  9. Python之什么是dict

    我们已经知道,list 和 tuple 可以用来表示顺序集合,例如,班里同学的名字: ['Adam', 'Lisa', 'Bart'] 或者考试的成绩列表: [95, 85, 59] 但是,要根据名字 ...

随机推荐

  1. MySQL的5种时间类型的比较

    日期时间类型 占用空间 日期格式 最小值 最大值 零值表示 DATETIME 8 bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23 ...

  2. Java 从入门到进阶之路(十一)

    之前的文章我们介绍了一下 Java 中的继承,接下来我们继续看一下 Java 中的继承. 在有些时候,我们通过类继承的方式可以获取父类的方法,但是有些时候父类为我们提供的方法并不完全符合我们的需求,这 ...

  3. STM32F4 阿波罗 库函数与C语言知识

    先聊一聊: 之前使用32都是用的库函数,但是没有理解为什么那么操作,有很多的文件我也不知道要看哪一个,感觉云里雾里,没有学清楚一件东西的感觉不太好,于是就在前几天一直跟着比较详细的视频学习.开始老师讲 ...

  4. luogu P1417 烹调方案 |dp

    题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...

  5. luogu P4302 [SCOI2003]字符串折叠

    题目描述 折叠的定义如下: 一个字符串可以看成它自身的折叠.记作S = S X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) = SSSS-S(X个S). 如果A = A', B = ...

  6. Java学习笔记(面向对象下)

    面向对象(下) 类的继承 类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类称为子类,现有类称为父类,子类会自动拥有父类所有可继承的属性和方法.(用extends关键字)   //定义A ...

  7. Spring Security OAuth2 Demo —— 密码模式(Password)

    前情回顾 前几节分享了OAuth2的流程与授权码模式和隐式授权模式两种的Demo,我们了解到授权码模式是OAuth2四种模式流程最复杂模式,复杂程度由大至小:授权码模式 > 隐式授权模式 > ...

  8. .Net Core使用分布式缓存Redis:数据结构

    一.前言 本篇主要使用StackExchangeRedis在.Net Core中使用Redis,使用基础见:点击此处. 二.五种基础数据结构 1.字符串类型String 字符串类型是Redis中最基本 ...

  9. 【Nodejs】375- 如何加快 Node.js 应用的启动速度

    我们平时在开发部署 Node.js 应用的过程中,对于应用进程启动的耗时很少有人会关注,大多数的应用 5 分钟左右就可以启动完成,这个过程中会涉及到和集团很多系统的交互,这个耗时看起来也没有什么问题. ...

  10. 【Java Web开发学习】Spring配置数据源

    Spring配置数据源 转载:https://www.cnblogs.com/yangchongxing/p/10027495.html =============================== ...