StableSet 和 OrderedSet 是有序集合,可以记住它们的顺序,并允许通过索引查找该顺序中的项目。
项目描述
StableSet 是一个可变集合,可以记住它的插入顺序。特性:快速 O(1) 插入、删除、迭代和成员资格测试。但索引查找慢 O(N)。
OrderedSet 是一种可变的数据结构,它是列表和集合的混合体。它记住它的插入顺序,以便每个条目都有一个可以查找的索引。特性:O(1) 索引查找、插入、迭代和成员资格测试。但删除慢 O(N)。
它们具有相似的接口,但在实现和性能方面有所不同。
安装
stableset
在 PyPI 上可用,并打包为 wheel。您可以将它列为项目的依赖项,形式不限。
要将它安装到您的当前 Python 环境中
pip install stableset
在检出存储库后,安装开发代码
pip install flit
flit install
用法示例
OrderedSet 的创建和使用类似于集合
>>> from ordered_set import OrderedSet
>>> letters = OrderedSet('abracadabra')
>>> letters
OrderedSet(['a', 'b', 'r', 'c', 'd'])
>>> 'r' in letters
True
在有序集合中查找条目的索引或根据索引查找条目是高效的。为了帮助此用例,.add()
方法返回添加项的索引,无论它是否已在集合中。
>>> letters.index('r')
2
>>> letters[2]
'r'
>>> letters.add('r')
2
>>> letters.add('x')
5
有序集合实现了与集合相同的并集(|
)、交集(&
)和差集(-
)操作。
>>> letters |= OrderedSet('shazam')
>>> letters
OrderedSet(['a', 'b', 'r', 'c', 'd', 'x', 's', 'h', 'z', 'm'])
>>> letters & set('aeiou')
OrderedSet(['a'])
>>> letters -= 'abcd'
>>> letters
OrderedSet(['r', 'x', 's', 'h', 'z', 'm'])
扩展了__getitem__()
和index()
方法,使其可以接受任何可迭代对象(除了字符串),返回一个列表,以执行类似NumPy的“复杂索引”。
>>> letters = OrderedSet('abracadabra')
>>> letters[[0, 2, 3]]
['a', 'r', 'c']
>>> letters.index(['a', 'r', 'c'])
[0, 2, 3]
有序集合实现了__getstate__
和__setstate__
,因此可以被序列化,并实现了抽象基类collections.MutableSet
和collections.Sequence
。
有序集合可以用作通用的集合类型,类似于typing
模块中的集合,如List、Dict和Set。例如,可以将变量的类型注释为OrderedSet[str]
或OrderedSet[Tuple[int, str]]
。
有序集合在数据科学应用中
有序集合可以用作稀疏词汇和密集索引数字之间的双向映射。从版本3.1开始,它除了接受列表外,还可以接受索引数字的NumPy数组。
这些功能的组合使得有序集合成为许多类似于pandas.Index
所使用功能的简单实现,并且许多操作的速度比等效的pandas操作要快。
为了与pandas.Index有更好的兼容性,get_loc
(查找单个索引的pandas方法)和get_indexer
(在pandas中反向执行复杂索引的方法)都是index
的别名(在有序集合中处理这两种情况)。
作者
StableSet是由Idan Miara实现的,它建立在有序集合的基础上。有序集合是由Elia Robyn Lake(原名Robyn Speer)实现的。Jon Crall对其进行了修改和测试,使其符合Python集合API。Roman Inflianskas添加了原始类型注解。
比较
StableSet 是一个可变集合,可以记住它的插入顺序。特性:快速 O(1) 插入、删除、迭代和成员资格测试。但索引查找慢 O(N)。
OrderedSet 是一种可变的数据结构,它是列表和集合的混合体。它记住它的插入顺序,以便每个条目都有一个可以查找的索引。特性:O(1) 索引查找、插入、迭代和成员资格测试。但删除慢 O(N)。
它们具有相似的接口,但在实现和性能方面有所不同。
有序集合的原始实现是由Raymond Hettiger发布到ActiveState Recipes的一个食谱,采用MIT许可证。
Hettiger的实现将内容保存在一个由字典引用的双向链表中。因此,通过索引查找一个项目是O(N)操作,而删除是O(1)。
这个版本的有序集合为了高效的查找进行了不同的权衡。其内容是一个标准的Python列表,而不是双向链表。这提供了O(1)的索引查找,但删除是O(N),以及稍微快一点的迭代。
其他实现
包含的有序集合实现与以下实现完全兼容(它们之间并不完全兼容)
- https://pypi.ac.cn/project/ordered-set/ - 由Elia Robyn Lake(
OrderedSet
的原版实现) - https://pypi.ac.cn/project/orderedset/ - 由Simon Percivall(使用Cython实现的更快版本的
OrderedSet
,目前仅适用于Python<3.9)
包含的StableSet实现与以下实现完全兼容
- https://pypi.ac.cn/project/Ordered-set-37/ - 由Xavier Bustamante Talavera(类似的基本实现,但名为
OrderedSet
)
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。