【问题标题】:Python equivalent for C++ STL vector/list containersC++ STL 向量/列表容器的 Python 等效项
【发布时间】:2011-06-05 22:39:52
【问题描述】:

Python 中是否有类似的东西可以用于类似于向量和列表的容器?

任何链接也会有所帮助。

【问题讨论】:

  • 对于链表:[a0,[a1,[a2,[a3,[...]]]]]

标签: c++ python list vector containers


【解决方案1】:

您可以使用内置列表 - 底层实现类似于 C++ 向量。尽管有些事情有所不同 - 例如,您可以将不同类型的对象放在同一个列表中。

http://effbot.org/zone/python-list.htm

注意:请记住,向量和列表是两种非常不同的数据结构。列表是异构的,即可以存储不同的对象类型,而 C++ 向量是同构的。向量中的数据以线性排列的形式存储,而列表中的数据是对变量类型和内存地址的引用集合

【讨论】:

  • 是否在 O(1) 时间内访问线性,类似于在 C++ 中将向量作为数组访问?
  • 是的,底层实现就像一个 C++ 向量。
  • 数组被称为列表(通常用作链表的快捷方式,这是一种完全不同的数据结构)是 Python 中为数不多的真正不幸的事情之一。
  • 谢谢,底部有性能因素,好资料!
  • 这个答案不完整,无法被接受:列表类与 std::list 完全不同。 (Python 中没有内置的链表实现。)
【解决方案2】:

列表是序列。

http://docs.python.org/tutorial/datastructures.html

append 类似于 push_back,其他方法也可以查看。

【讨论】:

    【解决方案3】:

    查看 Python 的 datastructures 页面。这是一个粗略的翻译:

    1. () => boost::Tuple(有一个重要区别,您不能在 Python 元组中重新分配值)
    2. [] => std::vector(正如 cmets 所暗示的那样,缺乏与向量相关的记忆特征)
    3. [] => 标准::列表
    4. {} => tr1::unordered_map 或 boost::unordered_map(本质上是一个哈希表)
    5. set() => std::set

    【讨论】:

    • 嗯,它可以是......这取决于支持的实现。但在 CPython 中,是的,[] != std::list
    • @Amber:没有 Python 实现敢为内置的 list 类型使用链表。这将完全搞砸依赖索引为 O(1) 的每一段代码(一个完全有效的假设) - 即非常多。我们可以放心地忽略这种情况。
    • @delnan 但是,与 CPython 实现相比,支持数据结构更接近于 std::list
    • @Amber:请详细说明。什么数据结构“接近链表”但提供例如O(1) 索引和追加?
    • @delnan b 树的某些变体不提供 O(1) 索引,但可以相当接近(足够接近,以至于除了最大的边缘情况之外的所有情况都不会有明显的差异)。
    【解决方案4】:

    作为标准库的一部分,Python 也有一个array 类型,它更高效并且成员类型受到限制。

    如果您需要认真对待大型向量/数组的有效操作,您也可以查看numpy(不是标准库的一部分)。

    【讨论】:

      【解决方案5】:
      py cpp
      deque deque
      PriorityQueue (or you may use heapq) priorityqueue
      set unordered_set
      list vector
      defaultdict(int) unordered_map
      list stack
      deque queue
      dict .get(val,0) unordered_map

      在 py >= 3.7 中,dict 记住插入顺序。 https://stackoverflow.com/a/51777540/13040423


      如果你需要 TreeMap / TreeSet

      https://github.com/grantjenks/python-sortedcontainers

      【讨论】:

        猜你喜欢
        • 2016-06-04
        • 2020-10-15
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 2011-10-08
        • 2011-07-23
        • 2013-09-19
        • 1970-01-01
        相关资源
        最近更新 更多