第二章数据结构总结

Python 序列类型最常见的分类就是可变和不可变序列。但另外一种分类 方式也很有用,那就是把它们分为扁平序列和容器序列。前者的体积更 小、速度更快而且用起来更简单,但是它只能保存一些原子性的数据, 比如数字、字符和字节。容器序列则比较灵活,但是当容器序列遇到可 变对象时,用户就需要格外小心了,因为这种组合时常会搞出一些“意 外”,特别是带嵌套的数据结构出现时,用户要多费一些心思来保证代 码的正确。

列表推导和生成器表达式则提供了灵活构建和初始化序列的方式,这两 个工具都异常强大。如果你还不能熟练地使用它们,可以专门花时间练 习一下。它们其实不难,而且用起来让人上瘾。

元组在 Python 里扮演了两个角色,它既可以用作无名称的字段的记录, 又可以看作不可变的列表。当元组被当作记录来用的时候,拆包是最安 全可靠地从元组里提取不同字段信息的方式。新引入的 * 句法让元组拆 包的便利性更上一层楼,让用户可以选择性忽略不需要的字段。具名元 组也已经不是一个新概念了,但它似乎没有受到应有的重视。就像普通 元组一样,具名元组的实例也很节省空间,但它同时提供了方便地通过 名字来获取元组各个字段信息的方式,另外还有个实用的 ._asdict() 方法来把记录变成 OrderedDict 类型。

Python 里最受欢迎的一个语言特性就是序列切片,而且很多人其实还没 完全了解它的强大之处。比如,用户自定义的序列类型也可以选择支持 NumPy 中的多维切片和省略(...)。另外,对切片赋值是一个修改可 变序列的捷径。

重复拼接 seq * n 在正确使用的前提下,能让我们方便地初始化含有 不可变元素的多维列表。增量赋值 += 和 *= 会区别对待可变和不可变序 列。在遇到不可变序列时,这两个操作会在背后生成新的序列。但如果 被赋值的对象是可变的,那么这个序列会就地修改——然而这也取决于

序列本身对特殊方法的实现。

序列的 sort 方法和内置的 sorted 函数虽然很灵活,但是用起来都不 难。这两个方法都比较灵活,是因为它们都接受一个函数作为可选参数 来指定排序算法如何比较大小,这个参数就是 key 参数。key 还可以被 用在 min 和 max 函数里。如果在插入新元素的同时还想保持有序序列 的顺序,那么需要用到 bisect.insort。bisect.bisect 的作用则是 快速查找。

除了列表和元组,Python 标准库里还有 array.array。另外,虽然 NumPy 和 SciPy 都不是 Python 标准库的一部分,但稍微学习一下它们, 会让你在处理大规模数值型数据时如有神助。

本章末尾介绍了 collections.deque 这个类型,它具有灵活多用和线 程安全的特性。表 2-3 将它和列表的 API 做了比较。本章最后也提及了 一些标准库中的其他队列类型的实现。

猜你喜欢

转载自www.cnblogs.com/yuchen991/p/12441562.html