我將一些C++代碼移植到Python中,其中一個數據結構是一個multiset,但我不確定如何在Python中對其進行建模。C++「multiset <int>」是否有Python等價物?
讓ms
是C++ multiset<int>
如何ms
使用(發佈一些例子)
multiset<int>::iterator it = ms.find(x)
ms.erase(it)
ms.insert(x)
ms.end()
ms.lower_bound(x)
ms.clear()
我將一些C++代碼移植到Python中,其中一個數據結構是一個multiset,但我不確定如何在Python中對其進行建模。C++「multiset <int>」是否有Python等價物?
讓ms
是C++ multiset<int>
如何ms
使用(發佈一些例子)
multiset<int>::iterator it = ms.find(x)
ms.erase(it)
ms.insert(x)
ms.end()
ms.lower_bound(x)
ms.clear()
沒有。請參閱Python's standard library - is there a module for balanced binary tree?,以獲取Python中C++樹形容器(map
,set
,multimap
,multiset
)的等效項的一般討論。
我能想到的最接近的是使用字典映射整數計數(也是整數)。但是,這並不能讓您按順序鍵入,因此您無法使用lower_bound
進行搜索。另一種方法是使用有序列表,正如其他人所建議的那樣,可能是(整數,計數)元組列表?如果您在完成所有插入操作後只需要搜索,則可以使用字典作爲構建的臨時結構,在完成所有插入操作後構建列表,然後使用列表進行搜索。
有幾種排序列表數據類型的實現可以滿足您的條件。兩種流行的選擇是SortedContainers和blist模塊。這些模塊中的每一個都提供了一個SortedList數據類型,該數據類型按排序順序自動維護元素,並允許快速插入和下限/上限查找。有一個performance comparison這也有幫助。
使用來自SortedContainers模塊SortedList的類型將是等效代碼:
from sortedcontainers import SortedList
sl = SortedList()
# Start index of `x` values
start = sl.bisect_left(x)
# End index of `x` values
end = sl.bisect_right(x)
# Iterator for those values
iter(sl[start:end])
# Erase an element
del sl[start:end]
# Insert an element
sl.add(x)
# Iterate from lower bound
start = sl.bisect_left(x)
iter(sl[x] for x in range(start, len(sl)))
# Clear elements
sl.clear()
這些操作的所有應在排序列表中的數據類型的工作效率。
您可以在python中查看'Counter'類:http://docs.python.org/2/library/collections.html#collections.Counter – taocp
是否有與我列出的函數/方法等價的東西? – MrP
'計數器'不等同於'std :: multiset'。 – juanchopanza