Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】


Posted in Python onOctober 30, 2019

本文实例讲述了Python列表原理与用法。分享给大家供大家参考,具体如下:

列表的基本认识

列表简介

列表:用于存储任意数目、任意类型的数据集合。
列表是内置可变序列,是包含多个元素的有序连续的内存空间。列表定义的标准语法格式:

a = [10,20,30,40]

其中,10,20,30,40 这些称为:列表 a 的元素。
列表中的元素可以各不相同,可以是任意类型。比如:

a = [10,20,'abc',True]

列表对象的常用方法汇总如下,方便大家学习和查阅。

方法 要点 描述
list.append(x) 增加元素 将元素 x 增加到列表 list 尾部
list.extend(aList) 增加元素 将列表 alist 所有元素加到列表 list 尾部
list.insert(index,x) 增加元素 在列表 list 指定位置 index 处插入元素 x
list.remove(x) 删除元素 在列表 list 中删除首次出现的指定元素 x
list.pop([index]) 删除元素 删除并返回列表 list 指定为止 index 处的元素,默认是最后一个元素
list.clear() 删除所有元素 删除列表所有元素,并不是删除列表对象
list.index(x) 访问元素 返回第一个 x 的索引位置,若不存在 x 元素抛出异常
list.count(x) 计数 返回指定元素 x 在列表 list 中出现的次数
len(list) 列表长度 返回列表中包含元素的个数
list.reverse() 翻转列表 所有元素原地翻转
list.sort() 排序 所有元素原地排序
list.copy() 浅拷贝 返回列表对象的浅拷贝

Python 的列表大小可变,根据需要随时增加或缩小。
字符串和列表都是序列类型,一个字符串是一个字符序列,一个列表是任何元素的序列。我
们前面学习的很多字符串的方法,在列表中也有类似的用法,几乎一模一样。

列表的创建

基本语法[]创建

>>> a = [10,20,'gaoqi','sxt']
>>> a = [] #创建一个空的列表对象

list()创建

使用 list()可以将任何可迭代的数据转化成列表。

>>> a = list() #创建一个空的列表对象
>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a = list("gaoqi,sxt")
>>> a
['g', 'a', 'o', 'q', 'i', ',', 's', 'x', 't']

range()创建整数列表

range()可以帮助我们非常方便的创建整数列表,这在开发中及其有用。语法格式为:
range([start,] end [,step])
start 参数:可选,表示起始数字。默认是 0
end 参数:必选,表示结尾数字。
step 参数:可选,表示步长,默认为 1
python3 中 range()返回的是一个 range 对象,而不是列表。我们需要通过 list()方法将其
转换成列表对象。
典型示例如下:

>>> list(range(3,15,2))
[3, 5, 7, 9, 11, 13]
>>> list(range(15,3,-1))
[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4]
>>> list(range(3,-10,-1))

[3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

推导式生成列表(简介一下,重点在 for 循环后讲)

使用列表推导式可以非常方便的创建列表,在开发中经常使用。但是,由于涉及到 for 循环
和 if 语句。在此,仅做基本介绍。在我们控制语句后面,会详细讲解更多列表推导式的细节。

>>> a = [x*2 for x in range(5)] #循环创建多个元素
>>> a
[0, 2, 4, 6, 8]
>>> a = [x*2 for x in range(100) if x%9==0] #通过 if 过滤元素
>>> a
[0, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198]

列表元素的增加

当列表增加和删除元素时,列表会自动进行内存管理,大大减少了程序员的负担。但这
个特点涉及列表元素的大量移动,效率较低。除非必要,我们一般只在列表的尾部添加元素
或删除元素,这会大大提高列表的操作效率。

append()方法

原地修改列表对象,是真正的列表尾部添加新的元素,速度最快,推荐使用。

>>> a = [20,40]
>>> a.append(80)
>>> a
[20, 40, 80]

+运算符操作

并不是真正的尾部添加元素,而是创建新的列表对象;将原列表的元素和新列表的元素依次
复制到新的列表对象中。这样,会涉及大量的复制操作,对于操作大量元素不建议使用。

>>> a = [20,40]
>>> id(a)
46016072
>>> a = a+[50]
>>> id(a)
46015432

通过如上测试,我们发现变量 a 的地址发生了变化。也就是创建了新的列表对象。

extend()方法

将目标列表的所有元素添加到本列表的尾部,属于原地操作,不创建新的列表对象。

>>> a = [20,40]
>>> id(a)
46016072
>>> a.extend([50,60])
>>> id(a)
46016072

insert()插入元素

使用 insert()方法可以将指定的元素插入到列表对象的任意制定位置。这样会让插入位置后
面所有的元素进行移动,会影响处理速度。涉及大量元素时,尽量避免使用。类似发生这种
移动的函数还有:remove()、pop()、del(),它们在删除非尾部元素时也会发生操作位置后
面元素的移动。

>>> a = [10,20,30]
>>> a.insert(2,100)
>>> a
[10, 20, 100, 30]

乘法扩展

使用乘法扩展列表,生成一个新列表,新列表元素时原列表元素的多次重复。

>>> a = ['sxt',100]
>>> b = a*3
>>> a
['sxt', 100]
>>> b
['sxt', 100, 'sxt', 100, 'sxt', 100]

适用于乘法操作的,还有:字符串、元组。例如:

>>> c = 'sxt'
>>> d = c*3
>>> c
'sxt'
>>> d
'sxtsxtsxt'

列表元素的删除

del 删除

删除列表指定位置的元素。

>>> a = [100,200,888,300,400]
>>> del a[1]
>>> a
[100,200,300,400]

Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】

pop()方法

pop()删除并返回指定位置元素,如果未指定位置则默认操作列表最后一个元素。

>>> a = [10,20,30,40,50]
>>> a.pop()
50
>>> a
[10, 20, 30, 40]
>>> a.pop(1)
20
>>> a
[10, 30, 40]

remove()方法

删除首次出现的指定元素,若不存在该元素抛出异常。

>>> a = [10,20,30,40,50,20,30,20,30]
>>> a.remove(20)
>>> a
[10, 30, 40, 50, 20, 30, 20, 30]
>>> a.remove(100)
Traceback (most recent call last):
File "<pyshell#208>", line 1, in <module>
a.remove(100)
ValueError: list.remove(x): x not in list

列表元素访问和计数

通过索引直接访问元素

我们可以通过索引直接访问元素。索引的区间在[0, 列表长度-1]这个范围。超过这个范围则
会抛出异常。

>>> a = [10,20,30,40,50,20,30,20,30]
>>> a[2]
30
>>> a[10]
Traceback (most recent call last):
File "<pyshell#211>", line 1, in <module>
a[10]
IndexError: list index out of range

index()获得指定元素在列表中首次出现的索引

index()可以获取指定元素首次出现的索引位置。语法是:index(value,[start,[end]])。其中,
start 和 end 指定了搜索的范围。

>>> a = [10,20,30,40,50,20,30,20,30]
>>> a.index(20)
1
>>> a.index(20,3)
5
>>> a.index(20,3) #从索引位置 3 开始往后搜索的第一个 20
5
>>> a.index(30,5,7) #从索引位置 5 到 7 这个区间,第一次出现 30 元素的位置
6

count()获得指定元素在列表中出现的次数

count()可以返回指定元素在列表中出现的次数。

>>> a = [10,20,30,40,50,20,30,20,30]
>>> a.count(20)
3

len()返回列表长度

len()返回列表长度,即列表中包含元素的个数。

>>> a = [10,20,30]
>>> len(a)
3

成员资格判断

判断列表中是否存在指定的元素,我们可以使用 count()方法,返回 0 则表示不存在,返回
大于 0 则表示存在。但是,一般我们会使用更加简洁的 in 关键字来判断,直接返回 True
或 False。

>>> a = [10,20,30,40,50,20,30,20,30]
>>> 20 in a
True
>>> 100 not in a
True
>>> 30 not in a
False

切片操作

我们在前面学习字符串时,学习过字符串的切片操作,对于列表的切片操作和字符串类似。
切片是 Python 序列及其重要的操作,适用于列表、元组、字符串等等。切片的格式如下:
切片 slice 操作可以让我们快速提取子列表或修改。标准格式为:
[起始偏移量 start:终止偏移量 end[:步长 step]]
注:当步长省略时顺便可以省略第二个冒号

典型操作(三个量为正数的情况)如下:

操作和说明 示例 结果
[:] 提取整个列表 [10,20,30][:] [10,20,30]
[start:]从 start 索引开始到结尾 [10,20,30][1:] [20,30]
[:end]从头开始知道 end-1 [10,20,30][:2] [10,20]
[start:end]从start到 end-1 [10,20,30,40][1:3] [20,30]
[start: end:step] 从 start 提取到 end-1,步长是 step [10,20,30,40,50,60,70][1:6:2] [20, 40, 60]

其他操作(三个量为负数)的情况:

示例 说明 结果
[10,20,30,40,50,60,70][-3:] 倒数三个 [50,60,70]
10,20,30,40,50,60,70][-5:-3] 倒数第五个到倒数第三个(包头不包尾) [30,40]
[10,20,30,40,50,60,70][::-1] 步长为负,从右到左反向提取 [70, 60, 50, 40, 30, 20, 10]

切片操作时,起始偏移量和终止偏移量不在[0,字符串长度-1]这个范围,也不会报错。起始
偏移量小于 0 则会当做 0,终止偏移量大于“长度-1”会被当成”长度-1”。例如:

>>> [10,20,30,40][1:30]
[20, 30, 40]

我们发现正常输出了结果,没有报错。

列表的遍历

for obj in listObj:
print(obj)

复制列表所有的元素到新列表对象

如下代码实现列表元素的复制了吗?

list1 = [30,40,50]
list2 = list1

只是将 list2 也指向了列表对象,也就是说 list2 和 list2 持有地址值是相同的,列表对象本
身的元素并没有复制。
我们可以通过如下简单方式,实现列表元素内容的复制:

list1 = [30,40,50]
list2 = [] + list1

注:我们后面也会学习 copy 模块,使用浅复制或深复制实现我们的复制操作。

列表排序

修改原列表,不建新列表的排序

>>> a = [20,10,30,40]
>>> id(a)
46017416
>>> a.sort() #默认是升序排列
>>> a
[10, 20, 30, 40]
>>> a = [10,20,30,40]
>>> a.sort(reverse=True) #降序排列
>>> a
[40, 30, 20, 10]
>>> import random
>>> random.shuffle(a) #打乱顺序
>>> a
[20, 40, 30, 10]

建新列表的排序

我们也可以通过内置函数 sorted()进行排序,这个方法返回新列表,不对原列表做修改。

>>> a = [20,10,30,40]
>>> id(a)
46016008
>>> a = sorted(a) #默认升序
>>> a
[10, 20, 30, 40]
>>> id(a)
45907848
>>> a = [20,10,30,40]
>>> id(a)
45840584
>>> b = sorted(a)
>>> b
[10, 20, 30, 40]
>>> id(a)
45840584
>>> id(b)
46016072
>>> c = sorted(a,reverse=True) #降序
>>> c
[40, 30, 20, 10]

通过上面操作,我们可以看出,生成的列表对象 b 和 c 都是完全新的列表对象。

reversed()返回迭代器

内置函数 reversed()也支持进行逆序排列,与列表对象 reverse()方法不同的是,内置函数
reversed()不对原列表做任何修改,只是返回一个逆序排列的迭代器对象。

>>> a = [20,10,30,40]
>>> c = reversed(a)
>>> c
<list_reverseiterator object at 0x0000000002BCCEB8>
>>> list(c)
[40, 30, 10, 20]
>>> list(c)
[]

我们打印输出 c 发现提示是:list_reverseiterator。也就是一个迭代对象。同时,我们使用
list?进行输出,发现只能使用一次。第一次输出了元素,第二次为空。那是因为迭代对象
在第一次时已经遍历结束了,第二次不能再使用

列表相关的其他内置函数汇总

max 和 min

用于返回列表中最大和最小值。

[40, 30, 20, 10]
>>> a = [3,10,20,15,9]
>>> max(a)
20
>>> min(a)
3

sum

对数值型列表的所有元素进行求和操作,对非数值型列表运算则会报错。

>>> a = [3,10,20,15,9]
>>> sum(a)
57

多维列表

二维列表

一维列表可以帮助我们存储一维、线性的数据。
二维列表可以帮助我们存储二维、表格的数据。例如下表的数据:

姓名 年龄 薪资 城市
高小一 18 30000 北京
高小二 19 20000 上海
高小五 20 10000 深圳

源码:

a = [

["高小一",18,30000,"北京"],
["高小二",19,20000,"上海"],
["高小一",20,10000,"深圳"],
]

内存结构图:
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】

>>> print(a[1][0],a[1][1],a[1][2])
高小二 19 20000

嵌套循环打印二维列表所有的数据(mypy_08.py)(由于没有学循环,照着敲一遍即可):

a = [
["高小一",18,30000,"北京"],
["高小二",19,20000,"上海"],
["高小一",20,10000,"深圳"],
]
for m in range(3):
for n in range(4):
print(a[m][n],end="\t")
print() #打印完一行,换行
======================================================================
运行结果:
高小一 18 30000 北京
高小二 19 20000 上海
高小一 20 10000 深圳

更多关于Python相关内容可查看本站专题:《Python列表(list)操作技巧总结》、《Python字符串操作技巧汇总》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python解析文件示例
Jan 23 Python
python 网络爬虫初级实现代码
Feb 27 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
python爬虫获取淘宝天猫商品详细参数
Jun 23 Python
python实现自动发送报警监控邮件
Jun 21 Python
python 字符串和整数的转换方法
Jun 25 Python
完美解决python中ndarray 默认用科学计数法显示的问题
Jul 14 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
Apr 27 Python
python 从list中随机取值的方法
Nov 16 Python
浅析python字符串前加r、f、u、l 的区别
Jan 24 Python
解决TensorFlow训练模型及保存数量限制的问题
Mar 03 Python
Python文件路径名的操作方法
Oct 30 #Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
Oct 30 #Python
解决python 上传图片限制格式问题
Oct 30 #Python
Python字典的概念及常见应用实例详解
Oct 30 #Python
Python集合基本概念与相关操作实例分析
Oct 30 #Python
python opencv将表格图片按照表格框线分割和识别
Oct 30 #Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
Oct 30 #Python
You might like
php获取json数据所有的节点路径
2015/05/17 PHP
PHP微信开发之二维码生成类
2015/06/26 PHP
PHP封装的Twitter访问类实例
2015/07/18 PHP
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
Python基本数据类型详细介绍
2014/03/11 Python
Python中time模块和datetime模块的用法示例
2016/02/28 Python
Python 多线程实例详解
2017/03/25 Python
对Python中range()函数和list的比较
2018/04/19 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
python实现决策树分类(2)
2018/08/30 Python
python 分离文件名和路径以及分离文件名和后缀的方法
2018/10/21 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
Python实现字典按key或者value进行排序操作示例【sorted】
2019/05/03 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
python字符串判断密码强弱
2020/03/18 Python
美国廉价机票预订网站:Cheapfaremart
2018/04/28 全球购物
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
自我鉴定书范文
2013/10/02 职场文书
高二政治教学反思
2014/02/01 职场文书
小松树教学反思
2014/02/11 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
朝花夕拾读书笔记
2015/06/29 职场文书
防震减灾主题班会
2015/08/14 职场文书
浅谈redis缓存在项目中的使用
2021/05/20 Redis
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫
windows10声卡驱动怎么安装?win10声卡驱动安装操作步骤教程
2022/08/05 数码科技