Python中是不是有类似于C++ STL map的结构?
Posted
技术标签:
【中文标题】Python中是不是有类似于C++ STL map的结构?【英文标题】:Is there a structure in Python similar to C++ STL map?Python中是否有类似于C++ STL map的结构? 【发布时间】:2010-09-06 23:12:17 【问题描述】:Python
中是否有一个结构支持与C++ STL map
类似的操作,并且操作的复杂性对应于C++ STL map
?
【问题讨论】:
你检查过 Python 3.1 中的有序字典吗? 调查他们。谢谢,这对我的目的应该足够了。哈希插入/删除是 O(1),但我想这将需要比 O(logN) 的树更多的内存。 树和哈希表都需要 O(n) 内存。 【参考方案1】:dict
通常足够接近 - 你想要它不做什么?
如果答案是“提供订单”,那么for k in sorted(d.keys())
到底有什么问题?使用太多内存,也许?如果您正在执行大量插入插入的有序遍历,那么好吧,点,您确实想要一棵树。
dict
实际上是一个哈希表而不是 b 树。但是map
没有定义 为 b 树,因此它不允许您将子树分离为新的 map
,它只是具有相同的性能复杂性。真正需要担心的是,当存在大量哈希冲突时,dict
会发生什么,但在需要严格的最坏情况性能保证的情况下使用 Python 肯定是非常罕见的。
【讨论】:
是的,dict 应该足够了。谢谢!dict
没有为map::lower_bound
提供等效项,因此我无法在dict
中搜索与已知键最近的元素。
@lvella:是的,这是“提供订单”的一部分(尽管在 C++ 中称为“有序容器”的东西在 Python 中通常称为“有序容器”)。如果您需要一个排序的容器,那么它可以是一个库,或者(出于学习目的)点击教科书并自己动手。
python dict 没有涵盖一个重要的用例。即对于比较相等的两个元素stl map
将只包含其中一个,即map
将它们粘合在一起。您想要使用它的情况是,例如,如果您想缓存某些对象上的函数调用结果。不同的对象散列不同,但我们希望参数的单个条目应该给出相同的值。 Python dict
作为 hashmap 不适合这种用法。【参考方案2】:
Python SortedDict 是一个类似于 C++ STL 的映射。你可以阅读它here 或here。
SortedDict 是键值对的容器,其中的顺序是 根据它们彼此之间的有序关系强加在键上。 与 Python 内置的 dict 数据类型一样,SortedDict 支持快速 按键插入、删除和查找。
【讨论】:
谷歌搜索时,注意不要使用 Django 调用的SortedDict
,因为它更像 OrderedDict
,保留插入顺序而不是键顺序。【参考方案3】:
我相信标准的 python 类型 dict() 在大多数情况下都可以解决问题。与 C++ 的 std::map 的区别在于 dict 是作为哈希映射实现的,而 C++ 的映射是基于树的。
【讨论】:
【参考方案4】:Python dictionaries [5.5].
【讨论】:
【参考方案5】:你看过Python dictionaries吗?
【讨论】:
【参考方案6】:查看 bintrees 模块(pip install bintrees)。这个包提供了用 Python 和 Cython/C 编写的 Binary-RedBlack- 和 AVL-Trees。
【讨论】:
以上是关于Python中是不是有类似于C++ STL map的结构?的主要内容,如果未能解决你的问题,请参考以下文章