【问题标题】:Is it effecient to remove and insert elements to begining of a list?删除和插入元素到列表的开头是否有效?
【发布时间】:2015-01-02 22:54:42
【问题描述】:

我在 python 网站上找到了这个。

也可以将列表用作队列,其中第一个元素 added 是检索到的第一个元素(“先进先出”);然而, 列表对此目的无效。虽然追加和弹出 列表的结尾很快,从开头插入或弹出 列表很慢(因为所有其他元素都必须移动 一个)

这没关系,但我的问题是,在列表开头删除或插入元素是否有效?

【问题讨论】:

  • 您的引用已经包含了答案:“从列表的开头插入或弹出很慢”(pop 是返回已删除项目的 remove)。
  • 您的文档中是否有部分尚未回答问题?

标签: python list data-structures stack


【解决方案1】:

正如评论者所指出的,您在文档中的引用明确表示它效率不高。

如果你想要一个高效的双端队列结构,你应该使用deque

【讨论】:

    【解决方案2】:

    正如文档所说,当您从列表的开头插入或删除元素时,所有其他元素都必须移动,因此这是对列表大小的O(n) 操作。

    但请注意,Python 使用引用语义,并且列表确实只包含指向元素的 指针,因此要进行移动,只移动指针而不是整个对象。因此,虽然是 O(n) 操作,但常数非常小。

    例如,在使用“值语义”的 C++ 中,std::vector(与 Python 列表最相似的容器)包含对象本身,并且要移动元素,操作更复杂,可能需要复制大量数据即使对于少数元素(如果它们很大)。

    【讨论】:

      【解决方案3】:

      集合模块中有一个专门设计的容器deque,它可以更有效地在两端插入和弹出元素。否则它使用与列表相同的方法,因此队列对象的实现应该保持不变而没有任何副作用,除了使用双端队列而不是列表。

      【讨论】:

      • deque 操作在开始时更高效率,在结束时更低效率。否则就不需要其他任何东西了。
      猜你喜欢
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 2016-04-16
      • 2018-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多