我正在将一些C ++代码移植到Python,其中一个数据结构是一个多重集,但我不确定如何在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()
答案 0 :(得分:4)
有几种排序列表数据类型的实现符合您的标准。两个流行的选择是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()
所有这些操作都应该在排序列表数据类型上有效工作。
答案 1 :(得分:2)
您可以使用bisect功能保留订单。例如,find
将成为
def index(a, x):
'Locate the leftmost value exactly equal to x'
i = bisect_left(a, x)
if i != len(a) and a[i] == x:
return i
raise ValueError
你会发现其他等价物in the docs。您现在可以获得end
ValueError
答案 2 :(得分:2)
有几个数据结构接近。
答案 3 :(得分:1)
没有。有关Python中C ++树容器(map
,set
,multimap
,multiset
等效项的一般性讨论,请参阅Python's standard library - is there a module for balanced binary tree?。
我能想到的最接近的是使用将整数映射到计数(也是整数)的字典。但是,这不能按顺序为您提供密钥,因此您无法使用lower_bound
进行搜索。另一种方法是使用有序列表,如其他人已经建议的那样,可能是(整数,计数)元组的列表?如果您只需要在完成所有插入后进行搜索,则可以使用字典作为构造的临时结构,在完成所有插入后构建列表,然后使用列表进行搜索。
答案 4 :(得分:0)
如果您不需要排序,可以将其用作 multiset<int>
(或 unordered_multiset<int>
):
from collections import Counter
def multiset(array):
return set(Counter(array).items())