当前位置: 首页 > 后端技术 > Python

SmoothPython阅读笔记---第三章字典与合集

时间:2023-03-26 17:10:57 Python

最近在看《SmoothPython》这本书,想把我的阅读笔记分享给大家,希望对大家有帮助,我对这本书很感兴趣,但是那些没有时间看的人。(文中大部分文字和图片摘自《FluentPython》一书和python官网)章节概述:本章通过对哈希表原理的深入探讨,介绍了两种类型的字典和集合。章节结构:通用映射类型字典推导常用映射方法映射查询字典变体不可变映射类型集合字典VS集合具体内容:通用映射类型映射类型:标准库中所有的映射类型都是使用dict实现的,因为它们都有这样的限制只有可散列的数据类型可以用作这些映射中的键可散列的数据类型:散列是可散列的,散列数据类型的对象,在其生命周期内,其散列值不变。映射类型需要的基本接口:定义在collections.abc模块中,包括MutableMapping,继承自Mapping,继承自(Container,IterableandSized),可以和isinstance一起使用判断某个数据是否为广义映射类型注意:非抽象映射类型并没有集成这些抽象基类,而是扩展了dict(Built-inTypes)和collections.UserDict类。字典理解dictcomp从任何以键值对作为元素的可迭代对象创建字典。形式:dictionary_variable={arg_one:arg_twoforarg_one,arg_twoinITERABLE_DATA}常用映射方式映射的查询关于查询,dict本身提供了get方法获取key值对应的value。但是如果密钥不存在怎么办?案例一,找到key并插入一个新值---setdefault:当字典d[k]找不到正确的key时,Python会抛出异常,当然我们可以使用d.get(k,default)来查找正确的键keycase的默认返回值。但是这些都不是最好的方法,我们可以使用setdefault来解决,尤其是通过搜索插入新值的时候,比如记录一个词的位置的例子,如果这个词是第一次遇到,keyvalue自然会找不到,我们可以通过d.setdefault(key,[]).append(value)来处理这种情况。这行代码的意思是当我们查找一个词时,如果这个词不存在,我们将这个词和一个空列表放入它的map中,并返回这个空列表。情况2,查找key对应的value----defaultdict&missing如果不是搜索插入新值,而是简单的搜索一个key没有映射值,我们也想得到一个默认的读取值.这种情况下,我们有两种方法,一种是使用defaultdict,另一种是自定义dict子类,然后自定义子类缺失的特殊方法。创建一个defaultdict对象,为构造函数提供一个可调用对象,当getitem找不到键时将调用此调用对象,并返回一些默认值。生成默认值的可调用对象存储在名为default_factory的实例属性中。这个default_factory只在getitem中被调用。例如,d[k]将返回此对象生成的默认值,但d.get(k)仍将返回None。虽然dict本身没有定义missing,但是如果getitem没有找到key,Python会自动调用missing。所以如果一个类继承了dict,可以自定义缺失的特殊方法来处理查询找不到的情况。字典应用场景的变体映射类型特点Collections.OrderedDict维护添加键时的顺序Collections.ChainMap持有几个不同的映射对象。在执行键查找时,这些对象作为一个整体被一个一个地查找,并用于嵌套作用域语言作为解释器时,它表示一个作用域的上下文集合计数器,为键准备一个整数计数器。每次更新一个key,计数器都会增加,用于hashabletableobjecttechnologycollections。UserDict在Python中再次实现了标准的dict,继承自MutableMapping允许用户继承和编写子类不可变映射类型。标准库中的所有映射类型都是可变的。但是从Python3.3开始,在types模块中引入了一个封装类MappingProxyType。如果你给这个类一个映射,它会返回一个只读的地图视图。但是,此只读视图是动态的。当原始映射发生变化时,可以观察到,但外界无法改变这种看法。这样就实现了单向变化,我们可以把打包后的不可变映射显示给用户。集合,Python中的set和frozenset,是唯一对象的集合。集合中的元素必须是可哈希的,但是集合类型本身是不可哈希的,此时frozenset是可哈希的。Dropoutoperator:a|b(combination),a&b(intersection),a-b(difference)setliteral:{val1,val2...}/emptysetset()setderivationsetcomps:{expression(x)forxinITERABLE_DATA}集合运算:集合数学运算集合比较运算集合类型其他方法字典和集合字典和集合是Python中速度较快的两种类型,原因在于它们背后的哈希表。哈希表:稀疏数组(具有空白元素的数组)。哈希表中的单元称为桶。在dict哈希表中,每个键值对占据一个cell,每个cell有两部分,对key的引用和对value的引用。字典和集合的比较:特点字典集合可散列的键必须是可散列的元素必须是可散列的内存开销大,空间效率低,因为散列表是稀疏的和耗内存的查询快速排序键顺序取决于加法和散列冲突的顺序案例中元素的顺序取决于将它们添加到集合中的顺序。添加元素可能会改变已有键的顺序,所以迭代和修改不能同时进行,这样可能会改变元素已有的顺序