2012-02-01 80 views
2

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

甚至有第三方数据结构可用于特定任务(例如Pandas,pytables等中的结构)。所以,如果我知道如何使用列表,字典,集合等,我应该能够实现任何任意的数据结构,如果我知道它应该完成什么?

换句话说,Python数据结构不能用于什么样的数据结构?

感谢

+1

我有时会发现在python中有些缺失的明显缺点是'一包东西'..更多信息请点击http://mail.python.org/pipermail/python-ideas/2009-July/005219。 HTML – wim 2012-02-01 05:57:35

回答

4

对于一些简单的数据结构(例如堆栈),您可以使用内置列表来完成您的工作。使用更复杂的结构(例如布隆过滤器),您必须使用语言支持的基元自己实现它们。

如果它们真的满足您的需求,那么您应该使用builtins,因为它们在很长一段时间内都会被一群人调试和优化。自己从头开始可能会产生较差的数据结构。无论您使用的是Python,C++,C#,Java等,您都应该首先查看内置的数据结构。他们通常会使用相同的系统原语来实现,而这些原语你必须自己动手做,但是经过了尝试和测试。

这些数据结构的组合(也可能是帮助模块的一些功能,如heapqbisect)通常足以实现实际编程中可能需要的最丰富的结构;然而,这并非总是如此。

只有当提供的数据结构不允许你完成你所需要的,并且没有可供选择的可靠的库时,你是否应该从头开始构建一些东西(或者扩展提供的东西)。假设你需要比丰富的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__类属性是可选的 - 主要是一个内存优化,以避免每个实例携带它自己的__dict__,这将比三个所需的属性/参考大得多)。可能最好由专用Python类来表示,而不是由其它现有的Python结构的直接成分的数据结构的

其它实例,包括tries(参见例如here)和graphs(参见例如here)。

0

鉴于存在于内存中的所有数据结构和内存实际上是只是一个list(阵列)...还有就是不能在基本的Python数据结构来表示没有数据结构(用适当的代码与他们交互)。

1

您可以使用Python数据结构来做任何你喜欢的事情。整个编程语言Lisp(现在人们使用Common Lisp或Scheme)都是围绕链表数据结构构建的,Lisp程序员可以构建他们选择的任何数据结构。

也就是说,有时候数据结构的Python数据结构不是最好的选择。例如,如果你想构建一个splay树,你应该推出你自己的或者使用像pysplay这样的开源项目。如果内置数据结构,解决您的问题,请使用它们。否则,请查看内置数据结构。一如既往,为这项工作使用最好的工具。