# 第六章:深入Python的set和dict
# 6.1 dict的abc继承关系
from collections.abc import *
- Sized: len
- Iterable: iter
- Container: contains
- Collection: Sized, Iterable, Container
- Mapping: Collection
- MutableMapping: Mapping
可以看出来 dict 和 list 有一些共有的魔法函数
from collections.abc import Mapping
# dict 属于 Mapping 类型
d = dict()
print(isinstance(d, Mapping))
# 6.2 dict的常用方法
借助编辑器,如 PyCharm 实时查看源码
d = {
'linda': {'company': 'Yahoo'},
'catherine': {'company': 'Google'}
}
# 清空
# d.clear()
# 浅拷贝
new_dict = d.copy()
# 深拷贝
import copy
new_dict_deep = copy.deepcopy(d)
new_dict['linda']['company'] = 'Ali'
print(d)
print(new_dict)
print(new_dict_deep)
dd = dict.fromkeys(['key1', 'key2'], 'default')
dd.get('key', None)
dd.keys(), dd.values(), dd.items()
# 获取key的value, 没有时更新为默认值
print(dd.setdefault('key', 'value'))
dd.update({'name': 'linda'})
print(dd)
# 6.3 dict的子类
- 不建议直接继承 c 语言实现的内置结构 dict,list
class MyDict(dict):
def __setitem__(self, key, value):
super().__setitem__(key, value * 2)
my_dict = MyDict(one=1)
print(my_dict) # 1, 某些情况下,不会调用重写的__setitem__
my_dict['one'] = 1
print(my_dict) # 2, 触发重写的 __setitem__
- 可继承 UserDict 实现自定义
- python 语法模拟 c 语言实现细节
from collections import UserDict
# python 语法模拟 c 语言实现细节
class CustomDict(UserDict):
def __setitem__(self, key, value):
super().__setitem__(key, value * 2)
dd = CustomDict(one=1)
print(dd)
d1 = UserDict({'kk': 'vv'}, k1='v1')
print(d1)
- defaultdict 实现 missing
from collections import defaultdict
d2 = defaultdict(list)
# 实现了 __missing__ 魔法函数,可参考UserDict __getitem__ 实现
value = d2['key']
print(value)
print(dict(d2))
# 6.4 set和frozenset
# set 不重复、无序
s1 = set('abcc')
print(s1) # {'a', 'c', 'b'}
# frozenset 不可变可以作为 dict key
f1 = frozenset('abcc')
print(f1)