使用Python的数据结构
Python有很多方便的数据结构,比如列表、元组、字典、集合等等。这些数据结构可以用来创建其他“传统”的数据结构。例如,我可以用Python的列表来创建一个栈,用collections.dequeue来创建一个队列,用字典来构建树和图等等。
还有一些第三方的数据结构可以用来处理特定的任务,比如Pandas和pytables中的结构。
所以,如果我会使用列表、字典、集合等,难道我就能实现任何我想要的数据结构,只要我知道它的功能吗?
换句话说,Python的数据结构有什么地方是不能用的呢?
谢谢
4 个回答
因为所有的数据结构都存在于内存中,而内存实际上就像一个列表
(数组)……所以没有任何数据结构是不能用基本的Python数据结构来表示的,只要有合适的代码来和它们进行交互。
你可以用Python的数据结构做任何你想做的事情。整个编程语言Lisp(现在人们主要用Common Lisp或Scheme)就是围绕链表这种数据结构构建的,Lisp程序员可以创建他们想要的任何数据结构。
不过,有时候Python自带的数据结构可能不是最合适的选择。比如,如果你想建立一个splay树,你要么自己动手做,要么使用像pysplay这样的开源项目。如果内置的数据结构能解决你的问题,那就用它们。否则,就要考虑其他的选择。总之,做事情时要用最合适的工具。
对于一些简单的数据结构,比如栈,你可以直接用内置的列表来完成任务。但对于更复杂的结构,比如布隆过滤器,你就需要自己动手实现,利用语言提供的基本功能。
如果内置的数据结构能满足你的需求,那就尽量使用它们,因为这些结构经过很多人的调试和优化,已经很成熟了。自己从头开始做可能会得到一个不太好的数据结构。无论你用的是Python、C++、C#、Java还是其他语言,首先应该考虑使用内置的数据结构。它们通常是用你自己实现时需要用到的基本功能来做的,但优势在于已经经过了实践检验。
将这些数据结构组合起来(可能还会用到一些辅助模块中的函数,比如heapq和bisect)通常就足够实现大多数在实际编程中需要的复杂结构;不过,这并不总是适用。
只有当现有的数据结构无法满足你的需求,并且没有可靠的替代库可用时,你才应该考虑从头开始构建(或者扩展现有的结构)。
假设你需要的功能超出了Python丰富的库所能提供的,可以考虑对象的属性(以及集合中的项)实际上是指向其他对象的“指针”(没有指针运算),也就是说,在Python中就像在Java中一样,它们是“可重置的引用”。在Python中,通常用None
值来表示属性或项中的空值,这就相当于C++中的NULL
或Java中的null
。
例如,你可以通过以下方式实现二叉树:
class Node(object):
__slots__ = 'data', 'left', 'right'
def __init__(self, data=None, left=None, right=None):
self.data = data
self.left = left
self.right = right
再加上遍历和类似操作的方法或函数(__slots__
这个类属性是可选的——主要是为了优化内存,避免每个Node
实例都携带自己的__dict__
,这会比需要的三个属性/引用大得多)。
其他一些可能更适合用专门的Python类来表示的数据结构,而不是直接组合其他现有Python结构的例子包括tries
(可以参考这里)和graphs
(可以参考这里)。