Python更多的數(shù)據(jù)結構
- 集合(set)
- 堆(heap)
- 雙向隊列(double-ended queue)
在Python內(nèi)置的數(shù)據(jù)類型中,tuple音诫,string雪位,list,dict這四種傳統(tǒng)的數(shù)據(jù)類型基本上夠用了香罐,可還是不夠靈活高效时肿◇Τ桑可變數(shù)據(jù)類型只有l(wèi)ist和dict兩種寸宏,dict的鍵值對應的表達也太死板击吱,所以在list的基礎上衍生出來了set覆醇、heap永脓、deque等高級丟丟的數(shù)據(jù)結構(當然功能也更加細化)。
8.1. 集合 set
沒有重復元素搅吁,不能使用索引訪問的數(shù)據(jù)結構哦,支持集合操作(交intersection谎懦、并union肚豺、差difference界拦、對稱差symmetric_difference)。不恰當?shù)谋扔飨淼椋暇褪且粋€大罐子截碴。
- 與list的關系蛉威。set(lst)將列表轉(zhuǎn)換成set日丹;list(st)將set轉(zhuǎn)換成list對象。
- 元素的加入:add(st蚯嫌,value)
- 元素的刪除(remove哲虾,指定元素)和彈出(pop齐帚,最小元素)
8.2 堆 heap
python中的堆 是一種按照某種順序排列的數(shù)據(jù)結構(比喻為水桶对妄,最輕的水果飄在最上面)敢朱。加入一個元素后自動排序孝常,剔除一個元素也自動排序。加入值相當與lst.append().sort()
构灸,讀取值相當與lst[0]
. 簡單的說喜颁,heap= list+sort
- 與list的關系。heap就是一種特殊排序的list(heap是基于樹的排序)曹阔,可通過
heapify(lst)
強制將list轉(zhuǎn)換成heap(注意半开,未排序,只是可以用后面的heapq模塊中的函數(shù)操作了) - 由于不存在heap數(shù)據(jù)結構的對象赃份,所以正常的堆(heap)的操作都需要將heap作為參數(shù)傳入函數(shù)(list的所有操作寂拆,堆heap均可用奢米,只是會破壞其排序結構)。
>>> from heapq import *
>>> from _heapq import heappop
>>> heap =[] # an empty list, is also a heap
>>> for i in range(10):
... heappush(heap,10-i) # push a value
...
>>> print(heap)
[1, 2, 5, 4, 3, 9, 6, 10, 7, 8]
>>> heappop(heap) # pop the minimal value
1
>>> print(heap)
[2, 3, 5, 4, 8, 9, 6, 10, 7]
>>> heapreplace(heap,6.5) # pop at first, and push another value
2
>>> print(heap)
[3, 4, 5, 6.5, 8, 9, 6, 10, 7]
>>> type(heap) # heap is a list in the implementation
<class 'list'>
- 更多操作纠永,最大(小)的n個值
>>> heap
[3, 4, 5, 6.5, 8, 9, 6, 10, 7]
>>> nlargest(3,heap) # 返回最大的多個值
[10, 9, 8]
>>> nsmallest(2,heap)# 返回最小的n個值
[3, 4]
>>> heap # 不是 inplace操作鬓长,heap沒變
[3, 4, 5, 6.5, 8, 9, 6, 10, 7]
8.3 雙端隊列(double-ended queue)
我理解為管道操作,可以兩邊塞渺蒿,也可以兩邊掏痢士。像list一樣從中間取一個值,當然可以(如果你非常想要這么做茂装,這不是queue的主要職責)怠蹂!
>>> from collections import deque
>>> q = deque(list(range(6)))
>>> print(q)
deque([0, 1, 2, 3, 4, 5])
>>> q.append('x')
>>> q.appendleft('-1')
>>> print(q)
deque(['-1', 0, 1, 2, 3, 4, 5, 'x'])
>>> print(q.pop())
x
>>> print(q.popleft())
-1
>>> print(q)
deque([0, 1, 2, 3, 4, 5])
>>> q.rotate(3)
>>> print(q)
deque([3, 4, 5, 0, 1, 2])
>>> q.rotate(-1)
>>> print(q)
deque([4, 5, 0, 1, 2, 3])
>>> type(q)
<class 'collections.deque'>
>>> q[2] = 10
>>> print(q)
deque([4, 5, 10, 1, 2, 3])
小節(jié)
- 針對list的各種不足,提出了set少态,heap城侧,deque三種新的數(shù)據(jù)結構。
- set能夠有效剔除重復數(shù)據(jù)彼妻,同是提供了一套的集合的邏輯操作運算(用的很多嫌佑,但是自己用list實現(xiàn)是很麻煩的事情)。
- heap 在與動態(tài)更新list數(shù)據(jù)的時候能夠很快的給出排序結果侨歉,也就是在push的時候數(shù)據(jù)的放置位置是按照大小判定的屋摇。
- deque 內(nèi)在實現(xiàn)就是list,除了操作的便捷性以外(這就夠了幽邓,不然純c的天下何須python)炮温,我沒有發(fā)現(xiàn)特別的優(yōu)勢。