1. 深入dict
from collections.abc import Mapping,MutableMapping # dict 属于mapping类型 a = {} print(isinstance(a,MutableMapping))
2.常用方法:
a = {"bobby1":{"company":"imooc"}, "bobby2:":{"company":"imooc"}} # clear # a.clear() #copy,返回浅拷贝 # new_dict = a.copy() # new_dict["bobby1"]["company"] = "imooc3" # 深拷贝 # import copy # new_dict = copy.deepcopy(a) # new_dict["bobby1"]["company"] = "imooc3" # fromkeys new_list = ["bobby1","bobby2"] new_dict = dict.fromkeys(new_list,{"company":"imooc"}) # get # value = new_dict.get("bobby",{}) # print(value) #items # for key,value in new_dict.items(): # print(key,value) # setdefault # 他对去调用D.get(k,d)同时D[k] 设置 default_value = new_dict.setdefault("bobby","imooc") print(new_dict) # update: new_dict.update(bobby="imooc") new_dict.update([("bobby","imooc")]) new_dict.update((("bobby","imooc"),))
3. dict的子类
# 不建议继承list和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)
# 建议用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)
from collections import defaultdict class Mydict(UserDict): def __setitem__(self,key,value): super().__setitem__(key,value*2) my_dict = Mydict(one=1) print(my_dict) my_dict = defaultdict(dict) my_value = my_dict["bobby"] # __missing__方法,如果找不到某个key,那么实现一个keyvalue
记住:其实setdefault里面实现了__missing__魔法函数,表示如果是找不到某个key,那么实现一个默认的keyvalue
3. set和frozenset
# set 集合 frozenset 不可变集合 无序 不重复 s = set('abcde') s = set(['a','b','c']) print(s) # 初始化方法 s = {'a','b'} print(type(s)) s2 = frozenset('abcde') # 不可变的类型,可以作为dict的key print(s2)
记住:和数学的操作一样,差集,交集,并集等。。
记住:在去重上应用很高,性能很高。
记住:还可以用:
for "c" in set: print ("i am in set")
记住:这里就实现了__contain__方法
记住:还有实现了__issubset__方法
4. dict和set他们背后实现的原理:
1. dict的key或者set的值都是必须可以hash的,不可变对象都是可以hash的,str,fronzenset,tuple,自己实现的类的__hash__
2. dict的内存花销大,但是查询速度快,自定义的对象或者Python内部的对象都使用dict包装的。
3.dict的存储顺序和元素添加顺序有关。
4.添加数据有可能改变已有数据的顺序。
5.list和array是一种自增的方式,随着数据在增加,申请内存空间的动作不断操作。
6.dict只有在内存空间少于1/3的时候才会去申请内存空间。