C++ "multiset<int>"有Python等效物吗?

Is there a Python equivalent for C++ "multiset<int>"?

本文关键字:Python gt multiset lt int C++      更新时间:2023-10-16

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

没有。请参见Python';s标准库-是否有用于平衡二叉树的模块?用于Python中C++树容器(mapsetmultimapmultiset)等价物的一般讨论。

我能想到的最接近的方法是使用一个将整数映射到计数(也是整数)的字典。然而,这并不能让你按顺序排列密钥,所以你不能使用lower_bound进行搜索。另一种选择是使用有序列表,正如其他人已经建议的那样,也许是(integer,count)元组的列表?如果你只需要在完成所有插入后进行搜索,你可以使用字典作为构建的临时结构,在完成所有的插入后构建列表,然后使用列表进行搜索。

有几个排序列表数据类型的实现符合您的标准。两种流行的选择是SortedContainers和blist模块。这些模块中的每一个都提供了一个SortedList数据类型,该类型会自动按排序顺序维护元素,并允许快速插入和下限/上限查找。还有一个性能比较也很有帮助。

使用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集合:

    • 有序dict:dict子类,它可以记住已添加的顺序条目。链接
    • Counter:用于计算可散列对象的dict子类。链接
  • 由django框架提供:

    • 具有多个具有相同值的键的dict:link
    • 已排序的dict(已弃用为python集合)现在包括一个已排序dict:link

您可以使用平分函数保持列表的顺序。例如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

您可以在文档中找到其他等效文件。您现在将获得ValueError ,而不是对照end进行检查

如果不需要排序,可以将其用作multiset<int>(或unordered_multiset<int>):

from collections import Counter
def multiset(array):
    return set(Counter(array).items())