是否存在Python等效的C ++“multiset <int>”?</int>

时间:2013-06-27 15:11:34

标签: c++ python set multiset

我正在将一些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()

5 个答案:

答案 0 :(得分:4)

有几种排序列表数据类型的实现符合您的标准。两个流行的选择是SortedContainersblist模块。这些模块中的每一个都提供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)

有几个数据结构接近。

  • python collections:

    • 有序dict:dict子类,记住添加的订单条目。 link
    • Counter:用于计算可哈希对象的dict子类。 link
  • 由django框架提供:

    • 具有相同值的多个键的词典:link
    • 已弃用的已排序的dict,因为python集合现在包含一个有序的dict:link

答案 3 :(得分:1)

没有。有关Python中C ++树容器(mapsetmultimapmultiset等效项的一般性讨论,请参阅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())