《Fluent Python》读书笔记-1.6 字典

字典类型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

 

发布了2053 篇原创文章 · 获赞 565 · 访问量 762万+

猜你喜欢

转载自blog.csdn.net/caimouse/article/details/103422885
今日推荐