append

向 List Object 任意位置插入数据,只要插入位置不是结尾,那么就需要将插入位置之后的元素后移,因此插入数据的时间复杂度为 O(n)。向数据插入数据有一个特例位置,向尾部追加 append 一个元素,时间复杂度为 O(1) 。

Python 的实现非常简单:

static int
app1(PyListObject *self, PyObject *v)
{Py_ssize_t n = PyList_GET_SIZE(self);// 省略了错误处理代码if (list_resize(self, n+1) < 0)return -1;Py_INCREF(v);PyList_SET_ITEM(self, n, v);return 0;
}

只有两步:重置 List 空间;新增元素设置到尾部。非常直接,常数时间内即可完成。

pop

List 通过 pop 方法弹出元素。具体实现:

//Objects/listobject.c:1025
static PyObject *
list_pop_impl(PyListObject *self, Py_ssize_t index)
/*[clinic end generated code: output=6bd69dcb3f17eca8 input=b83675976f329e6f]*/
{PyObject *v;int status;// 忽略一些无关代码v = self->ob_item[index];// 如果要弹出结尾元素,快捷处理if (index == Py_SIZE(self) - 1) {status = list_resize(self, Py_SIZE(self) - 1);if (status >= 0)return v; /* and v now owns the reference the list had */elsereturn NULL;}// 如果位于 List 中间,则删除元素Py_INCREF(v);status = list_ass_slice(self, index, index+1, (PyObject *)NULL);if (status < 0) {Py_DECREF(v);return NULL;}return v;
}

pop 元素根据弹出元素是否是尾部元素区别处理,如果是尾部元素,那么只是进行 resize 操作,弹出元素会被直接截断抛弃。实际上在这个过程中有可能根本不会发生真正的 resize,只是调整了 ob_size 的大小。此时时间复杂度为O(1)。

较为复杂的情况是弹出元素在数组中间或者头部,当目标元素弹出后,会在 List 中出现一个 “空缺”,其后的元素会被 “前移”,这与插入过程恰好相反,时间复杂度为O(n)。

因此,pop 方法从尾部弹出的效率更高,长 List 频繁的从中部弹出元素,性能会变得很差。如果有随机弹出的需要,最好考虑其他更合适的容器对象,比如dequeue。

今天就这样,明天继续努力~

关注我,了解程序员的烧脑日常,还有开源 Python 教程。

c++ list容器获取第n给元素_深入Python(17)-List 的 append 和 pop相关推荐

  1. js获取iframe中的元素_在 HTML 中包含资源的新思路

    作者:scott jehl 翻译:疯狂的技术宅 原文:https://www.filamentgroup.com/lab/html-includes/未经许可严禁转载 注意:这篇文章描述了一种我们仍需 ...

  2. python中元组怎么存放元素_关于python列表和元组的基本操作

    一.列表 列表是python中最常出现的一种数据存储形式,掌握列表的基本操作可以快速而有效的提高我们的代码书写效率.列表中存放的数据有如下基本操作:如增.删.改.查,掌握了这四个操作,就基本掌握了列表 ...

  3. c++ list容器获取第n给元素_Java总结之容器家族--Collection*

    一.概述 Collection是[收集品]的意思,这里称[容器],是java中的一个接口,位于java.util包下 Collection下有三大接口:List(列表).Set(集合).Queue(队 ...

  4. jquery 获取id最大的元素_超全整理!JQuery中的选择器集合

    JQuery的选择器总结 选择器是获取元素并进行操作的一种方式,在使用CSS选择器时,开发人员有时候需要考虑浏览器是否支持某些选择器.而在JQuery中,使用选择器则不需要考虑这些问题,与传统的JS获 ...

  5. [转载] python获取set中某些元素_取集合中元素_Python Set集合

    参考链接: Python set集合 copy() Set集合 阅读本文需要3分钟 2019.09.05 集合(set)是一个无序不重复元素的序列.基本功能是进行成员关系测试和删除重复元素.可以使用大 ...

  6. python获取set中某些元素_取集合中元素_Python Set集合

    Set集合 阅读本文需要3分钟 2019.09.05 集合(set)是一个无序不重复元素的序列.基本功能是进行成员关系测试和删除重复元素.可以使用大括号 { } 或者 set() 函数创建集合,注意: ...

  7. linkedhashmap获取第n个元素_机试真题分享——交换链表前后第K个元素

    题目描述 给定一个编码链表和一个加密条件K,对编码进行加密. 加密规则:把编码从前往后开始数第K个元素和从后往前数第K个元素进行交换. 注意:编码的长度为0.第一个编码的序号是1. 示例: 输入: [ ...

  8. python如何取map中的元素_在Python中使用map()获取列表元素在字符串中存在的次数...

    下面是对goalPost移动的一个响应("我可能需要regex,因为在不久的将来我将需要单词分隔符"): 此方法解析文本一次,以获得所有"单词"的列表.每个单词 ...

  9. python list查找元素_使用python list 查找所有匹配元素的位置实例

    使用python list 查找所有匹配元素的位置实例 如下所示: import re word = "test" s = "test abcdas test 1234 ...

最新文章

  1. javascript 制作的美化select,利用cookie保存选择
  2. 12月9日 php环境的安装和基本知识的学习
  3. Go-select和switch的使用区别
  4. linux系统 个人使用情况,个人使用Linux操作系统常要做的事
  5. 基本入门程序编写格式和注意事项
  6. 冠榕智能灯光控制协议分析(controller-node)
  7. java 小数点保留_Java小数点位数保留
  8. 如何计算一组数据的波动幅度_如何用Excel计算一个投资组合(双资产/三资产)的波动率?...
  9. win10安装stanza及简单使用
  10. 还没有女朋友的朋友们,你们有福了,学会CycleGAN把男朋友变成女朋友
  11. matlab画空间直线,空间直线x y=z怎么画
  12. “《三国演义》人物出场统计“实例讲解
  13. Java代码关于TIFF/TIF图片转PNG
  14. 0002 c语言 字母排序
  15. 为你的 Linux 桌面设置一张实时的地球照片
  16. 【MySQL:Use Of MySQL】使用记录
  17. 1+X Web前端证书中级备考攻略
  18. Jexus-5.6.3使用详解
  19. DBI、DPI、DSI LCD 接口简介
  20. Labview 运行myrio发生冲突:拒绝访问:该终端配置的语言无法兼容主机LabVIEW语言。对于实时终端,可通过MAX修改终端的语言环境,确保终端语言与主机语言一致。

热门文章

  1. Windows下更改pip镜像源
  2. row间距 table 某一行_UITableview的一个section下的各行Row之间可以设置间隔一段距离吗?...
  3. [OS复习]文件管理2
  4. [OS复习]操作系统综述2
  5. 数据库设计与查询语句的优化
  6. 【CyberSecurityLearning 74】DC系列之DC-5渗透测试
  7. 初次尝试HTML,用记事本编写代码并以html格式保存后用Google浏览器打开
  8. 以操作系统的角度述说线程与进程
  9. 解决spring-boot-maven-plugin not found爆红
  10. 详细介绍Linux硬盘挂载步骤