使用Python的数据结构

2 投票
4 回答
2843 浏览
提问于 2025-04-17 12:05

Python有很多方便的数据结构,比如列表、元组、字典、集合等等。这些数据结构可以用来创建其他“传统”的数据结构。例如,我可以用Python的列表来创建一个栈,用collections.dequeue来创建一个队列,用字典来构建树和图等等。

还有一些第三方的数据结构可以用来处理特定的任务,比如Pandas和pytables中的结构。

所以,如果我会使用列表、字典、集合等,难道我就能实现任何我想要的数据结构,只要我知道它的功能吗?

换句话说,Python的数据结构有什么地方是不能用的呢?

谢谢

4 个回答

0

因为所有的数据结构都存在于内存中,而内存实际上就像一个列表(数组)……所以没有任何数据结构是不能用基本的Python数据结构来表示的,只要有合适的代码来和它们进行交互。

1

你可以用Python的数据结构做任何你想做的事情。整个编程语言Lisp(现在人们主要用Common Lisp或Scheme)就是围绕链表这种数据结构构建的,Lisp程序员可以创建他们想要的任何数据结构。

不过,有时候Python自带的数据结构可能不是最合适的选择。比如,如果你想建立一个splay树,你要么自己动手做,要么使用像pysplay这样的开源项目。如果内置的数据结构能解决你的问题,那就用它们。否则,就要考虑其他的选择。总之,做事情时要用最合适的工具。

4

对于一些简单的数据结构,比如栈,你可以直接用内置的列表来完成任务。但对于更复杂的结构,比如布隆过滤器,你就需要自己动手实现,利用语言提供的基本功能。

如果内置的数据结构能满足你的需求,那就尽量使用它们,因为这些结构经过很多人的调试和优化,已经很成熟了。自己从头开始做可能会得到一个不太好的数据结构。无论你用的是Python、C++、C#、Java还是其他语言,首先应该考虑使用内置的数据结构。它们通常是用你自己实现时需要用到的基本功能来做的,但优势在于已经经过了实践检验。

将这些数据结构组合起来(可能还会用到一些辅助模块中的函数,比如heapqbisect)通常就足够实现大多数在实际编程中需要的复杂结构;不过,这并不总是适用。

只有当现有的数据结构无法满足你的需求,并且没有可靠的替代库可用时,你才应该考虑从头开始构建(或者扩展现有的结构)。

假设你需要的功能超出了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(可以参考这里)。

撰写回答