list 列表

什么是list

列表是Python中特有的一种线性数据结构,列表是可变的,有序的,我们可以用选择操作符来改变任意位置的值,和数组不同的是,列表可以同时保存不同类型的元素(异构)。


在CPython中,list是一个存储指针的长度可变的数组(用C++的话来说是一个动态数组)。也就是说列表中的每个元素存储的并不是对象本身,而是一个指向对象的引用。


list有哪些功能

list的创建

我们可以直接使用选择操作符来创建列表,也可以使用list()来创建

stuff = list()
stuff = []

list的方法

索引

因为列表的本质依然是一个数组,所以也支持数组的索引操作

时间复杂度:

下表索引:O(1)O(1)O(1)

切片索引:O(k)O(k)O(k)

增加元素

append()

append(x)操作可以再列表的末尾添加一个元素

时间复杂度:

和数组一样,时间复杂度为O(1)O(1)O(1)

insert()

insert(i, x)可以用来在索引i处添加元素x

时间复杂度:

要想在索引i插入某个元素,我们必须先将索引i及之后的元素向后移动一位,然后再给索引i赋值

因此插入元素时需要的后移操作的次数和列表内元素的个数有关,所以时间复杂度为O(n)O(n)O(n)

extend()

extend(iterable)操作将一个可迭代对象的每一个元素添加到列表末尾

lis = [1, 2, 3, 'a', 4]
lis.extend("hello")
print(lis)
>>>
[1, 2, 3, 'a', 4, 'h', 'e', 'l', 'l', 'o']

时间复杂度:

操作过程为先遍历读取可迭代对象的每个元素,然后添加到列表末尾,时间复杂度为O(k)O(k)O(k)

删除元素

pop()

pop(i=-1)用来移除列表中的某个元素并返回,可以传入索引值,默认为-1。也就是说pop()默认移除最后一位元素。

这里我们可以看到,当我们使用pop()时,尽管索引为4的元素仍然指向4,但是我们的列表长度已经缩短了。有兴趣的可以参考Python的列表实现,以及resize()的用法

时间复杂度:

如果只是移除最后一位元素,那么时间复杂度为O(1)O(1)O(1)

如果移除的是列表中的元素,那么还需要进行数据前移,前移的次数也和列表大小有关,因此时间复杂度为O(n)O(n)O(n)

remove()

remove(x)操作可以移除x元素在数组中的第一个匹配项

当我们remove(5)时,会从列表中删除对元素5的引用。

时间复杂度:

remove(x)操作可以视为先查找再移除最后数据前移,而查找和数据前移都和数组的大小有关,所以时间复杂度为O(n)O(n)O(n)。但实际使用上,remove()的操作效率较低,因为同时执行了查找和数据前移操作。

del

del操作可以根据索引值删除列表中的元素,也可以切片删除或直接删除整个列表

lis = [1,2,3,4,5]
del lis[0]
>>>
[2, 3, 4, 5]del lis[0:2]
>>>
[4, 5]del lis[:]
>>>
[]

同时,del操作也可以用来删除变量,要注意的是del删除的是引用而不是对象本身。关于del语句的详细用法以后再细说。可阅读

时间复杂度:

因为del也需要先查找并再删除后前移元素,所以时间复杂度以也是O(n)O(n)O(n)

clear()

clear()操作等价于del list[:],直接删除列表全部元素

时间复杂度:

根据直觉,我认为clear()操作的时间复杂度为O(n)O(n)O(n),因为我们需要不断地循环来删除所有的元素。但是在这篇文档中提到clear()的时间复杂度为O(1)O(1)O(1)。

后来在这里找到了解释。clear()操作的时间复杂度取决于我们的Python解释器。对于CPthyon来说,时间复杂度确实是O(n)O(n)O(n),因为list需要去主动删除每一个引用以避免内存泄漏。但是对于其他的解释器(PyPy)来说,有可能实现O(1)O(1)O(1)。

import timefor size in 10000, 100000, 1000000, 10000000:lis = [0] * sizestart = time.time()lis.clear()end = time.time()print(f'{size:<10} : {end - start}')>>>
10000      : 2.47955322265625e-05
100000     : 0.0002560615539550781
1000000    : 0.00399017333984375
10000000   : 0.03731894493103027

可以看到,对于CPython来说,时间确实是呈线性增长的。

修改元素

list的元素修改直接通过索引完成

时间复杂度:

如果是下标索引,时间复杂度为O(1)O(1)O(1)

如果是切片索引,时间复杂度为O(k)O(k)O(k),可看成下标索引重复kkk次

查找元素

index()

index(x, start, end)操作可以返回元素x第一次出现的索引值,如果没找到会出现ValueError异常

时间复杂度:

为了查找特定元素,我们需要遍历列表,所以时间复杂度为O(n)O(n)O(n)

count()

count(x)操作可返回元素x在列表中出现的次数

时间复杂度:

同样的,需要遍历整个列表才能得到结果,所以时间复杂度为O(n)O(n)O(n)

总结

其实Python中的list和C++中的vector很类似,如果想看底层实现,可以去看看cpython解释器的具体实现。

方法 时间复杂度 说明
[i] O(1)O(1)O(1)
[i1, i2] O(k)O(k)O(k)
append(x) O(1)O(1)O(1)
insert(i, x) O(n)O(n)O(n)
extend(iterable) O(k)O(k)O(k)
pop() O(1)O(1)O(1)
pop(i) O(n)O(n)O(n)
remove(x) O(n)O(n)O(n)
del O(n)O(n)O(n)
clear() O(n)O(n)O(n) 取决于解释器
index(x) O(n)O(n)O(n)
count(x) O(n)O(n)O(n)
其他常用方法

Split()函数

split() 函数可以将字符串按照规律分割为小片段(也被称为字),然后存储在一个列表中,例如:

>>> string = "hello world"
>>> words = string.split()
>>> print(words)
['hello', 'world']

我们还可以指定分隔符(默认为空格),例如:

>>> string = "Hello_world_what_a_good_day"
>>> words = string.split()
>>> print(words)
['Hello_world_what_a_good_day']>>> words = string.split("_")
>>> print(words)
['Hello', 'world', 'what', 'a', 'good', 'day']

list的优点和缺点

优点:

  1. 可以添加任意类型的元素
  2. 通过索引快速访问
  3. 适合做末尾的添加操作
  4. Python将列表设计成了一个很强大的数据结构,主要体现在列表的特性上,例如列表推导式(List comprehensions)等,详情见list的特性

缺点:

  1. 不利于做元素的删除和插入操作

list的特性

待补充…


相关章节

Python数据结构——array
Python数据结构——list
Python数据结构——tuple

Python数据结构——list相关推荐

  1. python3 namedtuple_你不能低估的Python数据结构Namedtuple(二)

    上篇你不能低估的Python数据结构Namedtuple(一)讲了namedtuple的一些基本用法,本篇继续. namedtuples和数据类(Data Class)之间有什么区别? 功能 在Pyt ...

  2. python线性表和队列_[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列...

    python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构 ...

  3. python数据结构 树_python数据结构之二叉树的建立实例

    先建立二叉树节点,有一个data数据域,left,right 两个指针域 复制代码 代码如下: # -*- coding: utf - 8 - *- class TreeNode(object): d ...

  4. python数据结构包括什么_Python中的数据结构详解

    概述 在深入研究数据科学和模型构建之前,Python中的数据结构是一个需要学习的关键内容 了解Python提供的不同数据结构,包括列表.元组等 介绍 数据结构听起来是一个非常直截了当的话题,但许多数据 ...

  5. python数据结构树和二叉树,python数据结构树和二叉树简介

    一.树的定义 树形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树. 树的递归定义: 树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树 ...

  6. python数据结构推荐书-关于数据结构,有哪些不错的参考书推荐?

    学习编程,数据结构是你必须要掌握的基础知识,那么数据结构到底是什么呢? 其实数据结构就是用来描述计算机里存储数据的一种数学模型,因为计算机里要存储很多乱七八糟的数据,所以也需要不同的数据结构来描述. ...

  7. CodeSalt | Python数据结构的实现 — 链表

    Python数据结构实现-链表 1. 简单介绍 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Point ...

  8. Python数据结构——tuple

    tuple 元组 什么是tuple 元组是一种和列表非常相似的线性数据结构,也支持不同的数据类型. 最大的区别就是元组一旦创建不可改变,和string一样,所有改变元组内容的操作都会返回一个新的元组. ...

  9. Python数据结构——array

    array 数组 array是什么 一般来说,array基本是所有程序语言都有的一种基础线性结构,元素以特定的顺序存储在一段连续的内存中. 在Python中其实也有array这种数据结构,和其他语言的 ...

最新文章

  1. python项目2019_2019 年 11 月精选 GitHub 上 几个牛逼 Python 的项目
  2. Eclipse中Junit测试中@Before不执行
  3. 04 数据操作 + 数据预处理【动手学深度学习v2】
  4. SAP CRM系统订单模型的设计与实现
  5. DeepLearningAI 学习笔记 1.2 logistic 回归
  6. 输入mysql -v_Mysql数据库使用笔记
  7. 依赖项出现感叹号怎么办_「电脑常用技巧」不喜欢看到的黄色感叹号
  8. ======第一章总结及习题======
  9. 实验1-6 输出带框文字 (5 分)
  10. 130242014029-黄超强-实验一
  11. 那些精贵的3D视觉系统学习资源总结(附书籍、网址与视频教程)
  12. FZU 1502 Letter Deletion
  13. C++ 课设 职工工资管理系统
  14. Windows7包含哪些版本
  15. 银行计算机岗位职称,银行职称有哪些,等级是如何划分的
  16. 微信引流常用几大技巧
  17. QQ群名片尾巴生成原理
  18. 天瑞地安科技集团小编分析时下最热APP软件如何利用H5推广的
  19. 寒冬已至?四面楚歌的Android工程师该何去何从
  20. [转]SAP R/3开发类及表/结构资料

热门文章

  1. (char*)x C语言中的和*的详解
  2. 金融量化alpha和beta值的意义
  3. python访问数据库oracle_python连接oracle数据库
  4. python语音控制智能家电_Python 树莓派智能音箱语音控制电脑开关机-Python 实用宝典...
  5. Leetcode 234 回文链表 (每日一题 20210730)
  6. 点云网络的论文理解(六)-Frustum PointNets 总体概括
  7. Git 笔记:基本操作工作流程
  8. tensorboardX笔记:理解graph
  9. 数据库笔记——数据模型
  10. Python爬虫应用实战-网站数据爬取及数据分析