字典类型dict在一般用户程序里不是常常使用到的,但是它提供的功能是时时刻刻在使用着,因此python里对它作了很大的优化,采用hash算法来实现。
python提供映射的抽象基类:collections.abc.Mapping,而字典就是继承这个抽象基类,可以使用下面的代码来判断:
from collections import abc
my = {}
print(isinstance(my, abc.Mapping))
字典解释生成数据
s = [(1,'a'), (2,'b')]
d = {y: x for x, y in s}
print(d)
输出如下:
{'a': 1, 'b': 2}
三种字典dict/defaultdict/OrderedDict的方法列表
字典缺少键key的处理
在对字典进行访问时,如果键不存在会抛出异常,那么怎么样避免呢?一种方法是使用d.get(k,default)方法,另一种是使用d.setdefault(k,[])方法。
s = [(1,'a'), (2,'b')]
d = {y: x for x, y in s}
print(d)
l = d.get('d', [])
l.append(3)
d['d'] = l
print(d)
这里使用d.get('d', [])提前判断是否存在键的功能,也可以修改为:
d.setdefault('e', []).append(4)
print(d)
结果输出如下:
{'a': 1, 'b': 2}
{'a': 1, 'b': 2, 'd': [3]}
{'a': 1, 'b': 2, 'd': [3], 'e': [4]}
使用defaultdict解决缺少键问题
前面使得普通字典的方法来解决,其实可以使用defaultdict来解决,它可以构造一个工厂模式来解决。
import collections
dd = collections.defaultdict(list)
dd['f'].append(23)
print(dd)
在这里dd['f'].append(23),它是先调用list()函数创建一个列表,然后插入键‘f’,再保存列表到字典,因为它实现了函数__missing__的处理,同理用户也可以自己定义此函数来处理。
collections.OrderedDict维护键插入排序。
collections.ChainMap连接多个字典成一个搜索对象。
collections.Counter计算每个键有多少次出现。
collections.UserDict用来给用户继承使用,可以写用户需求的字典对象。
不修改的字典,代理类MappingProxyType
from types import MappingProxyType
d = {'a':1}
dp = MappingProxyType(d)
print(d, dp)
dp['b'] = 2
这里会输出出错信息:
{'a': 1} {'a': 1}
Traceback (most recent call last):
File "D:/ src/ex9-dt1.py", line 34, in <module>
dp['b'] = 2
TypeError: 'mappingproxy' object does not support item assignment
集合set
基本上是用来去掉重复元素。
s = { i for i in range(10)}
print(s)
set集合解析生成,set集合满足集合运算。
字典dict和集合set都是使用hash表技术构造的,所以性能最好,优于其它容器。不过,如果数据量比较大,就不要使用这两个容器实现,因为它占用非常多内存空间,原因就是HASH表是分散保存,而不是连续保存的。是一种用空间换时间的算法。
同样由于是HASH表技术,插入字典和集合的顺序就是HASH解决冲突的顺序,所以不同的插入顺序,导致字典或集合的顺序不一样。
另外往字典里增内容时,会导致HASH表项重新分配,因此字典在遍历时增加内容,需要重新遍历所有元素。
玩转人工智能库-深入浅出OpenCV
https://edu.csdn.net/course/detail/26616