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的结构?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中为我自己的自定义向量模板类实现迭代器(类似于 STL)[重复]

C 等价于 C++ STL [重复]

STL容器简介

STL 常用方法

C++ STL 之 deque

C++ 中的 map 与 hash_map