每日提醒:ctrl+鼠标左键可以查看源码,同时辅助使用pycharm侧边栏的structure
6-1 dict的abc继承关系
from collections.abc import Mapping, MutableMapping
#dict属于mapping类型
a = {}
print (isinstance(a, MutableMapping))
6-2 dict的常用方法
1浅拷贝与深拷贝
浅拷贝会改变原来的值
a = {"bobby1":{"company":"imooc"},
"bobby2": {"company": "imooc2"}
}
#clear
# a.clear()
# pass
#copy, 返回浅拷贝
new_dict = a.copy()
new_dict["bobby1"]["company"] = "imooc3"
深拷贝,相当于真正建立副本,不会改变原值
a = {"bobby1":{"company":"imooc"},
"bobby2": {"company": "imooc2"}
}
#深拷贝
import copy
new_dic0=copy.deepcopy(a)
new_dic0["bobby1"]["company"] = "imooc3"
print(new_dic0)
2字典的#formkeys方法,赋予新键
#formkeys
new_list = ["bobby1", "bobby2"]
new_dict1 = dict.fromkeys(new_list, {"company":"imooc"})
print(new_dict1)
3get方法
get方法可以在查询为空时,指定返回值,不为空时,返回原字典中的值
a = {"bobby1":{"company":"imooc"},
"bobby2": {"company": "imooc2"}
}
#get方法可以在查询为空时,指定返回值,不为空时,返回原字典中的值
print(a.get("bobbb",{}))
print(a.get("bobby1",{}))
4item方法,进行拆包
a = {"bobby1":{"company":"imooc"},
"bobby2": {"company": "imooc2"}
}
#item方法,进行拆包
for key,value in a.items():
print(key,value)
4setdefault方法查询值,如果查不到key对应的值,则添加设置的值到原来的字典中去
#setdefault方法查询值,如果查不到key对应的值,则添加设置的值到原来的字典中去
print(a.setdefault('booooo',{"这是我设置的默认值"}))
5update方法,字典合并:
a = {"bobby1":{"company":"imooc"},
"bobby2": {"company": "imooc2"}
}
new_list = ["bobby1", "bobby2"]
new_dict0 = dict.fromkeys(new_list, {"company":"imooc"})
new_dict0.update((("bobby","imooc"),))
new_dict1=new_dict0
print(new_dict1)
6-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)
from collections import UserDict
class Mydict(UserDict):
def __setitem__(self, key, value):
super().__setitem__(key, value*2)
my_dict = Mydict(one=1)
# my_dict["one"] = 1
print (my_dict)
from collections import defaultdict
my_dict = defaultdict(dict)
my_value = my_dict["bobby"]
6-4 set和frozense
#set 集合 fronzenset (不可变集合) 无序, 不重复
# s = set('abcdee')
# s = set(['a','b','c','d','e'])
s = {'a','b', 'c'}
# s = frozenset("abcde") #frozenset 可以作为dict的key
# print(s)
#向set添加数据
another_set = set("cef")
re_set = s.difference(another_set)
re_set = s - another_set
re_set = s & another_set
re_set = s | another_set
#set性能很高
# | & - #集合运算
print(re_set)
print (s.issubset(re_set))
# if "c" in re_set:
# print ("i am in set")
6-5 dict和set的实现原理
1. dict的key或者set的值 都必须是可以hash的 #不可变对象 都是可hash的, str, fronzenset, tuple,自己实现的类 __hash__ #2. dict的内存花销大,但是查询速度快, 自定义的对象 或者python内部的对象都是用dict包装的 # 3. dict的存储顺序和元素添加顺序有关 # 4. 添加数据有可能改变已有数据的顺序
6-6小结