第一章:数据结构和算法

2021年11月21日 阅读数:6
这篇文章主要向大家介绍<python3-cookbook>第一章:数据结构和算法,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

第一章:数据结构和算法

介绍:python3-cookbook这本书是高级用法,不是小白使用书
目的:写做目的是记录下本身学习这本书的过程以及收获
书籍地址:https://python3-cookbook.readthedocs.io/zh_CN/latest/index.html
html

1.1解压序列赋值给多个变量:

问题:如今有一个包含 N 个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给 N 个变量?python

解决方案:经过一个简单的赋值语句解压并赋值给多个变量。 惟一的前提就是变量的数量必须跟序列元素的数量是同样的。算法

 

1.2解压可迭代对象赋值给多个变量:

问题:若是一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError 。 那么怎样才能从这个可迭代对象中解压出 N 个元素出来?数据结构

解决方案:Python 的星号表达式能够用来解决这个问题数据结构和算法

 

1.3保留最后N个元素:

问题:在迭代操做或者其余操做的时候,怎样只保留最后有限几个元素的历史记录函数

解决方案:collections.deque学习

deque 类能够被用在任何你只须要一个简单队列数据结构的场合编码

 

1.4查找最大或最小的N个元素:

问题:怎样从一个集合中得到最大或者最小的 N 个元素列表?spa

解决方案:heapq 模块有两个函数:nlargest() 和 nsmallest() 能够完美解决这个问题设计

 

1.5实现一个优先级队列:

问题:怎样实现一个按优先级排序的队列? 而且在这个队列上面每次 pop 操做老是返回优先级最高的那个元素

解决方案:利用 heapq 模块实现了一个简单的优先级队列:

 

1.6字典中的键映射多个值:

问题:怎样实现一个键对应多个值的字典(也叫 multidict)?

解决方案:使用 collections 模块中的 defaultdict 来构造这样的字典。 defaultdict 的一个特征是它会自动初始化每一个 key 刚开始对应的值,因此你只须要关注添加元素操做了

 

1.7字典排序:

问题:想建立一个字典,而且在迭代或序列化这个字典的时候可以控制元素的顺序。

解决方案:使用 collections 模块中的 OrderedDict 类

 

1.8字典的运算:

问题:怎样在数据字典中执行一些计算操做(好比求最小值、最大值、排序等等)?

解决方案:对字典值执行计算操做,一般须要使用 zip() 函数先将键和值反转过来,而后结合max(), min(), sorted()方法实现

 

1.9查找两字典的相同点:

问题:怎样在两个字典中寻寻找相同点(好比相同的键、相同的值等等)?

解决方案:在两字典的 keys() 或者 items() 方法返回结果上执行集合操做

 

1.10删除序列相同元素并保持顺序:

问题:怎样在一个序列上面保持元素顺序的同时消除重复的值?

解决方案:若是序列上的值都是 hashable 类型,那么能够很简单的利用集合或者生成器来解决这个问题。

 

1.11命名切片:

问题:若是你的程序包含了大量没法直视的硬编码切片,而且你想清理一下代码。

解决方案:内置的 slice() 函数建立了一个切片对象。全部使用切片的地方均可以使用切片对象

 

1.12序列中出现次数最多的元素:

问题:怎样找出一个序列中出现次数最多的元素呢?

解决方案:collections.Counter 类就是专门为这类问题而设计的, 它甚至有一个有用的 most_common() 方法直接给了答案。

 

1.13经过某个关键字排序一个字典列表:

问题:有一个字典列表,想根据某个或某几个字典字段来排序这个列表。

解决方案:经过使用 operator 模块的 itemgetter 函数,能够很是容易的排序这样的数据结构。

 

1.14排序只支持原生比较的对象:

问题:你想排序类型相同的对象,可是他们不支持原生的比较操做。

解决方案:内置的 sorted() 函数有一个关键字参数 key ,能够传入一个 callable 对象给它, 这个 callable对象对每一个传入的对象返回一个值,这个值会被 sorted 用来排序这些对象。

 

1.15经过某个字段将记录分组:

问题:你有一个字典或者实例的序列,而后你想根据某个特定的字段好比 date 来分组迭代访问。

解决方案:itertools.groupby() 函数对于这样的数据分组操做很是实用。 

 

1.16过滤序列元素:

问题:你有一个数据序列,想利用一些规则从中提取出须要的值或者是缩短序列

解决方案:使用列表推导、使用生成器表达式迭代产生过滤的元素

 

1.17从字典中提取子集:

问题:你想构造一个字典,它是另一个字典的子集。

解决方案:字典推导、经过建立一个元组序列而后把它传给 dict() 函数也能实现

 

1.18映射名称到序列元素:

问题:你有一段经过下标访问列表或者元组中元素的代码,可是这样有时候会使得你的代码难以阅读, 因而你想经过名称来访问元素。

解决方案:collections.namedtuple() 函数经过使用一个普通的元组对象来帮你解决这个问题

 

1.19转换并同时计算数据:

问题:你须要在数据序列上执行汇集函数(好比 sum() , min() , max() ), 可是首先你须要先转换或者过滤数据

解决方案:一个很是优雅的方式去结合数据计算与转换就是使用一个生成器表达式参数。 

 

1.20合并多个字典和映射:

问题:如今有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操做, 好比查找值或者检查某些键是否存在。

解决方案:使用 collections 模块中的 ChainMap 类。一个 ChainMap 接受多个字典并将它们在逻辑上变为一个字典。