第一章:数据结构和算法

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

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

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

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

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

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

解决方案:Python 的星号表达式可以用来解决这个问题

1.3保留最后N个元素:

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

解决方案:collections.deque

deque 类可以被用在任何你只需要一个简单队列数据结构的场合

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

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

解决方案: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 接受多个字典并将它们在逻辑上变为一个字典。

<python3-cookbook>第一章:数据结构和算法的更多相关文章

  1. python3-cookbook笔记:第一章 数据结构和算法

    python3-cookbook中每个小节以问题.解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构.函数.类等特性在某类问题上如何更好地使 ...

  2. NHibernate.3.0.Cookbook第一章第六节Handling versioning and concurrency的翻译

    NHibernate.3.0.Cookbook第一章第六节Handling versioning and concurrency的翻译   第一章第二节Mapping a class with XML ...

  3. 【学习总结】java数据结构和算法-第二章-数据结构和算法概述

    总目录链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 数据结构和算法的关系 几个实际编程中的问题 线性结构和非线性结构 数据结构和算法的关系 几个实际编程中 ...

  4. 【python cookbook】【数据结构与算法】4.找到最大或最小的N个元素

    问题:想在某个集合中找出最大或最小的N个元素 解决方案:heapq模块中的nlargest()和nsmallest()两个函数正是我们需要的. >>> import heapq &g ...

  5. C语言数据结构——第一章 数据结构的概念

    一.数据结构的基本概念 1.1-数据结构是什么? 数据结构是计算机存储和组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.一般情况下,精心选择的数据结构可以带来更高的运行或者 ...

  6. ACwing算法基础课听课笔记(第一章,基础算法一)(二分)

    二分法: 在看这个视频前,我对于二分法是一头雾水的,又加上这个算法平常从来没写过所以打了一年了还没正式搞过.视频提到ACwing上的一道题,我用自以为聪明的方法去做,结果TLE了,实在丢人,不说了,开 ...

  7. 【python cookbook】【数据结构与算法】20.将多个映射合并为单个映射

    问题:在逻辑上将多个字典或映射合并为一个单独的映射结构,以此执行某些特定的操作,比如查找值或者检查键是否存在 解决方案:利用collections模块中的ChainMap类 ChainMap可接受多个 ...

  8. 【python cookbook】【数据结构与算法】18.将名称映射到序列的元素中

    问题:希望通过名称来访问元素,减少结构中对位置的依赖性 解决方案:使用命名元组collections.namedtuple().它是一个工厂方法,返回的是python中标准元组类型的子类,提供给它一个 ...

  9. 【python cookbook】【数据结构与算法】13.通过公共键对字典列表排序

    问题:想根据一个或多个字典中的值来对列表排序 解决方案:利用operator模块中的itemgetter()函数对这类结构进行排序是非常简单的. # Sort a list of a dicts on ...

  10. 【python cookbook】【数据结构与算法】12.找出序列中出现次数最多的元素

    问题:找出一个元素序列中出现次数最多的元素是什么 解决方案:collections模块中的Counter类正是为此类问题所设计的.它的一个非常方便的most_common()方法直接告诉你答案. # ...

随机推荐

  1. 解决 Chrome 下载不了东西 失败 - 已屏蔽 的问题

    或许你怎么也想不到是IE的问题 由于IE的安全设定问题 但是这个锅 确实不应该是IE来背. 因为我IE下载都没出现这个问题. 解决方法是这样的: IE>Internet选项>安全>自 ...

  2. 使用 SharpZipLib 打包数据到 ZIP 文件

    SharpZipLib 是一个优秀的开源的第三方压缩库,可以通过这个库将一些导出的文件打包到一个 ZIP 文件当中供用户下载. GitHub 地址:https://github.com/icsharp ...

  3. mysql 架构篇系列 1 复制原理和复制架构

    一. 复制概述 mysql 从3.23版本开始提供复制功能,复制是指将主数据库的ddl和dml操作通过二进制日志传到复制服务器(也叫从服务器)上,然后在从服务器上对这些日志重新执行(也叫重做),从而使 ...

  4. .NET Core + Abp踩坑和填坑记录(1)

    1. Net Core 的DI和Abp的DI并存 Startup中 ConfigureServices返回值改为IServiceProvider 在ConfigureServices最后调用retur ...

  5. spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)

    不多说,直接上干货! 前言   其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...

  6. Jenkins问题记录:android构建时提示Unzipping /home/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zip to /home/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9 Except

    -------------- -------------- 问题:今日job构建报出如下错误: Unzipping /home/.gradle/wrapper/dists/gradle-3.3-all ...

  7. Java虚拟机监控命令

    熟悉java的人都知道jdk的bin目录中有很多小工具,其中就包括用于监视虚拟机和故障处理的工具,今天就来仔细了解下各个工具的用法 jps JVM Process Status Tool,用于显示指定 ...

  8. java ReentrantLock

    介绍 ReentrantLock称为重入锁,比内部锁synchonized拥有更强大的功能,它可中断.可定时.设置公平锁 [注]使用ReentrantLock时,一定要释放锁,一般释放放到finnal ...

  9. Java 趣史-差点把 Java 命名成了 Silk(丝绸)

    差点把 Java 命名成了 Silk(丝绸) Java 命名的由来 Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名.Java语言中的许多库类名称,多与咖啡有关:如JavaBeans(咖啡豆). ...

  10. Spark提高篇——RDD/DataSet/DataFrame(一)

    该部分分为两篇,分别介绍RDD与Dataset/DataFrame: 一.RDD 二.DataSet/DataFrame 先来看下官网对RDD.DataSet.DataFrame的解释: 1.RDD ...