6.4 创建新集合

    现在来看看Python内置容器类型支持哪些扩展。当然,我们不会举例说明如何扩展每个容器。如果这么做,那么这本书的体积就会变得超出我们的控制了。

    我们会以一个容器为例来看看扩展容器的过程是怎样的。

    1.定义需求。这可能包括研究维基百科(Wikipedia),通常从这里开始看:http://en. wikipedia.org/wiki/Data_structure。由于我们需要考虑到边界情况,因此数据结构的设计可能会非常复杂。

    2.如果需要,看一下必须实现collections.abc模块中的哪些方法才能新增我们需要的功能。

    3.创建一些测试用例。这也需要仔细研究算法,才能确定我们可以正确地处理边界情况。

    4.代码。

    我们需要特别强调,在尝试发明新的数据结构前,认真研习基础知识是非常重要的。除了在网上寻找概述和总结,对于具体内容的学习也是非常必要的。可以阅读Cormen、Leiserson、Rivest和Stein所著的Introduction to Algorithms,Aho、Ullman和Hopcroft所著的Data Structures and Algorithms或者Steven Skiena所著的The Algorithm Design Manual。

    正如我们前面看到的,抽象基类定义了三大类集合:序列、映射和集合。有以下3种可自定义新集合的方法。

    • 扩展:操作现有的序列。
    • 封装:操作现有的序列。
    • 新建:创建一个新序列。

    理论上,我们可以给出多达9个示例——用每种不同的方法分别自定义每个集合。之后会对这个主题进行介绍,并且会探究一下如何创建新的序列、如何扩展和封装现有的序列。

    由于已经有很多扩展的映射(例如ChainMapOrderedDictdefaultdictCounter),因此我们只会简单地介绍如何创建新映射。我们也会探究如何创建一个新的有序包(或者称为多重集合)。