1.dict的abc继承关系
from collections.abc import Mapping, MutableMapping
#dict属于mapping类型
a = {}
#isinstance实例
#dict并没有继承MutableMapping,只是实现了当中的一些魔法方法
print(isinstance(a, MutableMapping))
2.dict的常用方法
(1)clear
它的作用是将字典清空
a = {"bobby1":{"company":"tencent1"},
"bobby2": {"company": "tencent2"}
}
print(a)
print(a.clear())
输出结果
{'bobby1': {'company': 'tencent1'}, 'bobby2': {'company': 'tencent2'}}
None
(2)浅拷贝
浅拷贝是并没有真正拷贝,而是引用原值。
a = {"bobby1":{"company":"tencent1"},
"bobby2": {"company": "tencent2"}
}
new_dict = a.copy()
new_dict["bobby1"]["company"] = "tencent3"
print(a)
print(new_dict)
输出结果
{'bobby1': {'company': 'tencent3'}, 'bobby2': {'company': 'tencent2'}}
{'bobby1': {'company': 'tencent3'}, 'bobby2': {'company': 'tencent2'}}
(3)深拷贝
深拷贝真正将原值拷贝了一份。
import copy
a = {"bobby1":{"company":"tencent1"},
"bobby2": {"company": "tencent2"}
}
new_dict = copy.deepcopy(a)
new_dict["bobby1"]["company"] = "tencent3"
print(new_dict)
print(a)
输出结果
{'bobby1': {'company': 'tencent3'}, 'bobby2': {'company': 'tencent2'}}
{'bobby1': {'company': 'tencent1'}, 'bobby2': {'company': 'tencent2'}}
(4)fromkeys
fromkeys 将可迭代对象转为dict
new_list = ["bobby1", "bobby2"]
new_dict = dict.fromkeys(new_list, {"company": "tencent"})
print(new_dict)
输出结果
{'bobby1': {'company': 'tencent'}, 'bobby2': {'company': 'tencent'}}
(5)update
new_dict = {'bobby1': "taobao",
'bobby2': "baidu"}
new_dict.update((("bobby3","tencent"),))
print(new_dict)
new_dict.update(booby4="bilibili")
print(new_dict)
输出结果
{'bobby1': 'taobao', 'bobby2': 'baidu', 'bobby3': 'tencent'}
{'bobby1': 'taobao', 'bobby2': 'baidu', 'bobby3': 'tencent', 'booby4': 'bilibili'}
(6)get
获取值,如果没用返回一个空字典。
new_dict = {'bobby1': "taobao",
'bobby2': "baidu"}
value = new_dict.get("bobby7", {})
print(value)
输出结果
{}
(7)setdefault
new_dict = {'bobby1': "taobao",
'bobby2': "baidu"}
default_value= new_dict.setdefault("bobby9","apple")
print(new_dict)
输出结果
{'bobby1': 'taobao', 'bobby2': 'baidu', 'bobby9': 'apple'}
(8)items()
new_dict = {'bobby1': "taobao",
'bobby2': "baidu"}
for key, value in new_dict.items():
print(key, value)
输出结果
bobby1 taobao
bobby2 baidu
3.dict的子类
(1)dict
class Mydict(dict):
def __setitem__(self, key, value):
super().__setitem__(key, value*2)
my_dict = Mydict(one=1)
my_dict["one"] = 1
print(my_dict)
输出结果
{'one': 2}
不建议继承dict和list
(2)UserDict
from collections import UserDict
class Mydict(UserDict):
def __setitem__(self, key, value):
super().__setitem__(key, value*2)
my_dict = Mydict(one=1)
print(my_dict)
输出结果
{'one': 2}
(3)defaultdict
from collections import defaultdict
my_dict = defaultdict(dict)
my_value = my_dict["bobby"]
print(my_dict)
print(my_value)
输出结果
defaultdict(<class 'dict'>, {'bobby': {}})
{}
4.set和frozenset
- set 集合
- fronzenset 不可变集合
- 无序,不重复
(1)初始化一个set
s = set('abcdee')
print(s)
s = set(['a','b','c','d','e'])
print(s)
s = frozenset("abcde") #frozenset可以作为dict的key
print(s)
输出结果
{'e', 'c', 'd', 'a', 'b'}
{'e', 'c', 'd', 'a', 'b'}
frozenset({'e', 'c', 'd', 'a', 'b'})
(2)集合运算
s = set('abcdee')
another_set = set("cef")
reset = s.difference(another_set) #差集
print(reset)
reset = s - another_set #差集
print(reset)
reset = s & another_set #取交集
print(reset)
reset = s | another_set #去并集
print(reset)
print(s.issubset(reset)) #s是不是reset的子集
输出结果
{'a', 'b', 'd'}
{'a', 'b', 'd'}
{'e', 'c'}
{'b', 'd', 'a', 'f', 'e', 'c'}
True
5.dict和set的实现原理
dict和set的存储都使用了哈希表,大大加快了查询速度。
哈希表
哈希表的查找
- dict查找的性能远远大于list
- 在list中随着list数据的增大,查找时间会增大
- 在dict中查找元素不会随着dict的增大而增大
- dict的key或者set的值 都必须是可以hash的
- 不可变对象都是可hash的, str, frozenset, tuple,包含__ hash __的自己实现的类
- dict的内存花销大,但是查询速度快, 自定义的对象或者python内部的对象都是用dict包装的
- dict的存储顺序和元素添加顺序有关
- 添加数据有可能改变已有数据的顺序