2012-02-01 82 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這樣的開源項目。如果內置數據結構,解決您的問題,請使用它們。否則,請查看內置數據結構。一如既往,爲這項工作使用最好的工具。