Python有很多方便的数据结构(列表,元组,字典,集合等),可用于制作其他“传统”数据结构(例如,我可以使用Python列表创建堆栈和一个collections.dequeue来创建一个队列,制作树和图等等)。Python的数据结构
甚至有第三方数据结构可用于特定任务(例如Pandas,pytables等中的结构)。所以,如果我知道如何使用列表,字典,集合等,我应该能够实现任何任意的数据结构,如果我知道它应该完成什么?
换句话说,Python数据结构不能用于什么样的数据结构?
感谢
Python有很多方便的数据结构(列表,元组,字典,集合等),可用于制作其他“传统”数据结构(例如,我可以使用Python列表创建堆栈和一个collections.dequeue来创建一个队列,制作树和图等等)。Python的数据结构
甚至有第三方数据结构可用于特定任务(例如Pandas,pytables等中的结构)。所以,如果我知道如何使用列表,字典,集合等,我应该能够实现任何任意的数据结构,如果我知道它应该完成什么?
换句话说,Python数据结构不能用于什么样的数据结构?
感谢
对于一些简单的数据结构(例如堆栈),您可以使用内置列表来完成您的工作。使用更复杂的结构(例如布隆过滤器),您必须使用语言支持的基元自己实现它们。
如果它们真的满足您的需求,那么您应该使用builtins,因为它们在很长一段时间内都会被一群人调试和优化。自己从头开始可能会产生较差的数据结构。无论您使用的是Python,C++,C#,Java等,您都应该首先查看内置的数据结构。他们通常会使用相同的系统原语来实现,而这些原语你必须自己动手做,但是经过了尝试和测试。
这些数据结构的组合(也可能是帮助模块的一些功能,如heapq和bisect)通常足以实现实际编程中可能需要的最丰富的结构;然而,这并非总是如此。
只有当提供的数据结构不允许你完成你所需要的,并且没有可供选择的可靠的库时,你是否应该从头开始构建一些东西(或者扩展提供的东西)。假设你需要比丰富的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结构的直接成分的数据结构的
鉴于存在于内存中的所有数据结构和内存实际上是只是一个list
(阵列)...还有就是不能在基本的Python数据结构来表示没有数据结构(用适当的代码与他们交互)。
您可以使用Python数据结构来做任何你喜欢的事情。整个编程语言Lisp(现在人们使用Common Lisp或Scheme)都是围绕链表数据结构构建的,Lisp程序员可以构建他们选择的任何数据结构。
也就是说,有时候数据结构的Python数据结构不是最好的选择。例如,如果你想构建一个splay树,你应该推出你自己的或者使用像pysplay这样的开源项目。如果内置数据结构,解决您的问题,请使用它们。否则,请查看内置数据结构。一如既往,为这项工作使用最好的工具。
我有时会发现在python中有些缺失的明显缺点是'一包东西'..更多信息请点击http://mail.python.org/pipermail/python-ideas/2009-July/005219。 HTML – wim 2012-02-01 05:57:35