Python中的SortedList詳解
Python SortedContainers Module
一款純 python 寫的對列表、字典、集合排序的模塊
Sorted Containers 是Apache2 許可的 Sorted Collections 庫,用純 Python 編寫,并且速度與 C 擴(kuò)展一樣快。
在需要排序的集合類型之前,Python 的標(biāo)準(zhǔn)庫非常有用。許多人會(huì)證明,即使沒有排序,您也可以真正走得很遠(yuǎn),但是,當(dāng)您真正需要排序列表,排序 dict 或排序集時(shí),您將面臨許多不同的實(shí)現(xiàn),其中大多數(shù)使用 C 擴(kuò)展而沒有出色的文檔和基準(zhǔn)。
在 Python 中,我們可以做得更好。
我們可以用純 Python 做到這一點(diǎn)!
from sortedcontainers import SortedList sl = SortedList(['e', 'a', 'c', 'd', 'b']) sl SortedList(['a', 'b', 'c', 'd', 'e']) sl *= 10_000_000 sl.count('c') 10000000 sl[-3:] ['e', 'e', 'e'] from sortedcontainers import SortedDict sd = SortedDict({'c': 3, 'a': 1, 'b': 2}) sd SortedDict({'a': 1, 'b': 2, 'c': 3}) sd.popitem(index=-1) ('c', 3) from sortedcontainers import SortedSet ss = SortedSet('abracadabra') ss SortedSet(['a', 'b', 'c', 'd', 'r']) ss.bisect_left('c') 2
上面顯示的所有操作都比線性時(shí)間快。上面的演示還占用了將近 1 GB 的內(nèi)存。當(dāng)排序列表乘以一千萬時(shí),它將存儲(chǔ)一千萬個(gè)對“ a”至“ e”中每一個(gè)的引用。每個(gè)引用在已排序的容器中需要八個(gè)字節(jié)。很難克服,因?yàn)檫@是指向每個(gè)對象的指針的代價(jià)。
與每個(gè)節(jié)點(diǎn)還必須存儲(chǔ)兩個(gè)指向子節(jié)點(diǎn)的指針的典型二叉樹實(shí)現(xiàn)(例如,紅黑樹,AVL-Tree,AA-Tree,Splay-Tree,Treap等)相比,開銷也減少了66%。
Sorted Containers 將所有工作從 Python 分類集合中剔除-簡化了 Python 的部署和使用。
無需安裝 C 編譯器或預(yù)先構(gòu)建和分發(fā)自定義擴(kuò)展。性能是一項(xiàng)功能,測試具有100%的單元測試覆蓋率和數(shù)小時(shí)的壓力。
安裝:
$ pip install sortedcontainers
可以使用 Python 的內(nèi)置幫助功能訪問解釋器中的文檔。該幫助適用于已排序容器中的模塊,類和方法。
import sortedcontainers help(sortedcontainers) from sortedcontainers import SortedDict help(SortedDict) help(SortedDict.popitem)
也可使用匿名函數(shù)排序
class sortedcontainers.SortedList(iterable=None, key=None)
Python SortedList
1.添加值
- SortedList.add(value) 添加新元素,并排序。時(shí)間復(fù)雜度O(log(n)).
- SortedList.update(iterable) 對添加的可迭代的所有元素排序。時(shí)間復(fù)雜度O(k*log(n)).
2.移除值
- SortedList.clear() 移除所有元素。時(shí)間復(fù)雜度O(n).
- SortedList.discard(value) 移除一個(gè)值元素,如果元素不存在,不報(bào)錯(cuò)。時(shí)間復(fù)雜度O(log(n)).
- SortedList.remove(value) 移除一個(gè)值元素,如果元素不存在,報(bào)錯(cuò)ValueError。時(shí)間復(fù)雜度O(log(n)).
- SortedList.pop(index=-1) 移除一個(gè)指定下標(biāo)元素,如果有序序列為空或者下標(biāo)超限,報(bào)錯(cuò)IndexError. 時(shí)間復(fù)雜度O(log(n
3.查找
SortedList.bisect_left(value) 查找元素可以插入的位置下標(biāo),如果這個(gè) value 已經(jīng)存在,則插入已經(jīng)存在的所有 values 之前(左側(cè)).時(shí)間復(fù)雜度O(log(n)).
s = SortedList([1,2,3,9,8,6,5,5,5,5,5]) s.bisect_left(5) Out[5]: 3 s Out[6]: SortedList([1, 2, 3, 5, 5, 5, 5, 5, 6, 8, 9])
SortedList.bisect_right(value) 查找元素可以插入的位置下標(biāo),如果這個(gè)value已經(jīng)存在,則插入已經(jīng)存在的所有values之后(右側(cè))。時(shí)間復(fù)雜度O(log(n)).
s.bisect_right(5) Out[7]: 8 s Out[8]: SortedList([1, 2, 3, 5, 5, 5, 5, 5, 6, 8, 9])
SortedList.count(value) 查找元素出現(xiàn)的次數(shù)。時(shí)間復(fù)雜度O(log(n)).
s.count(5) Out[9]: 5
SortedList.index(value, start=None, Stop=None) 查找索引范圍[start,stop)內(nèi)第一次出現(xiàn) value 的索引,如果 value 不存在,報(bào)錯(cuò)ValueError. 時(shí)間復(fù)雜度O(log(n)).
4.迭代值
SortedList.irange(minimun=None, maximum=None, inclusive=True, True, reverse=False) 返回 value = [minimun,maximum]之間的可迭代值,inclusive = Ture, True 第一個(gè)True表示包括索引minimun, 第二個(gè)Ture表示包括索引maximum,reverse是表示返回的可迭代值是否反轉(zhuǎn)。
SortedList.islice(start=None, stop=None, reverse=False) 返回index=[start, stop)之間的可迭代值(切片)。
5. 其他
SortedList.copy() 返回一個(gè)淺拷貝有序序列。時(shí)間復(fù)雜度O(n)。
淺拷貝(1)直接賦值,默認(rèn)淺拷貝傳遞對象的引用而已,原始列表改變,被賦值的列表也會(huì)做相同的改變。
a = [1,2,3] b=a b Out[60]: [1, 2, 3] a[0]=0 a Out[62]: [0, 2, 3] b Out[63]: [0, 2, 3]
淺拷貝(2) copy 函數(shù),淺拷貝傳遞子對象的引用,原始數(shù)據(jù)改變,只有子對象會(huì)改變。
a = [[1],2,3] b = a.copy() a Out[85]: [[1], 2, 3] b Out[86]: [[1], 2, 3] # 對象不改變 a.append(4) a Out[88]: [[1], 2, 3, 4] b Out[89]: [[1], 2, 3] # 子對象跟著改變 a[0].append(2) a Out[91]: [[1, 2], 2, 3, 4] b Out[92]: [[1, 2], 2, 3]
計(jì)算右側(cè)小于當(dāng)前元素的個(gè)數(shù)
from sortedcontainers import SortedList class Solution: def countSmaller(self, nums: List[int]) -> List[int]: ans = [] #sl = SortedList() q = [] # 插入排序 for x in reversed(nums): #i = sl.bisect_left(x) i = bisect_left(q, x) #print(i) ans.append(i) #sl.add(x) insort_left(q, x) return ans[::-1]
數(shù)組中的逆序?qū)?/h3>
from sortedcontainers import SortedList as sl
class Solution:
def reversePairs(self, nums: List[int]) -> int:
q = sl()
ans = 0
for i, x in enumerate(nums):
idx = q.bisect_right(x)
ans += i - idx
q.add(x)
return ans
from sortedcontainers import SortedList as sl class Solution: def reversePairs(self, nums: List[int]) -> int: q = sl() ans = 0 for i, x in enumerate(nums): idx = q.bisect_right(x) ans += i - idx q.add(x) return ans
到此這篇關(guān)于Python中的SortedList詳解的文章就介紹到這了,更多相關(guān)SortedList詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Python 爬取13個(gè)旅游城市,告訴你五一大家最愛去哪玩?
這篇文章主要介紹了Python 爬取13個(gè)旅游城市,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Python 安裝和配置flask, flask_cors的圖文教程
這篇文章主要介紹了Python 安裝和配置flask, flask_cors的圖文教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-04Python中關(guān)于面向?qū)ο蟾拍畹脑敿?xì)講解
要了解面向?qū)ο笪覀兛隙ㄐ枰戎缹ο蟮降资鞘裁赐嬉鈨?。關(guān)于對象的理解很簡單,在我們的身邊,每一種事物的存在都是一種對象??偨Y(jié)為一句話也就是:對象就是事物存在的實(shí)體2021-10-10Python HTMLParser模塊解析html獲取url實(shí)例
這篇文章主要介紹了Python HTMLParser模塊解析html獲取url實(shí)例,HTMLParser是python用來解析html的模塊,HTMLParser采用的是一種事件驅(qū)動(dòng)的模式,需要的朋友可以參考下2015-04-04Python腳本實(shí)現(xiàn)隨機(jī)數(shù)據(jù)生成自由詳解
這篇文章主要為大家詳細(xì)介紹了Python如何通過腳本實(shí)現(xiàn)隨機(jī)數(shù)據(jù)生成自由,文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2023-12-12python動(dòng)態(tài)進(jìn)度條的實(shí)現(xiàn)代碼
有時(shí)候我們需要使用print打印工作進(jìn)度,正常使用print函數(shù)會(huì)導(dǎo)致刷屏的現(xiàn)象,本文通過實(shí)例代碼給大家介紹python動(dòng)態(tài)進(jìn)度條的實(shí)現(xiàn)方法,感興趣的朋友跟隨小編一起看看吧2019-07-07