深入解析Python中的list列表及其切片和迭代操作


Posted in Python onMarch 13, 2016

有序列表list

>>> listTest = ['ha','test','yes']
>>> listTest
['ha', 'test', 'yes']

len()获取list元素个数。

>>> len(listTest)
3

可以用索引来访问每一个元素,0表示第一个,-1还可以表示最后一个,即倒数第一个,依此类推-2表示倒数第二个,超过了也会报越界错误。

>>> listTest[0]
'ha'
>>> listTest[1]
'test'
>>> listTest[3]
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> listTest[-1]
'yes'
>>> listTest[-2]
'test'

也可以把元素插入到指定的位置,比如索引号为1的位置:

>>> listTest.insert(1,'jack')
>>> listTest
['ha', 'jack', 'test', 'yes']

删除末尾元素,用pop()方法,添加到末尾用append():

>>> list
['ha', 'jack', 'test', 'yes']
>>> listTest.pop()
'yes'
>>> listTest
['ha', 'jack', 'test']

删除指定位置的元素,用pop(i)方法,其中i是索引位置:

>>> listTest
['ha', 'jack', 'test']
>>> listTest.pop(1)
'jack'
>>> listTest
['ha', 'test']

把某个元素替换,直接赋值即可,并且类型也可以不同:

>>> listTest
['ha', 'test']
>>> listTest[1] = 'debug'
>>> listTest
['ha', 'debug']
>>> listTest[1] = 123
>>> listTest
['ha', 123]

list也可以嵌套:

>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4
>>> s[1]
'java'
>>> s[2]
['asp', 'php']
>>> s[2][1]
'php'

空的list:

>>> L = []
>>> len(L)
0


不可变列表tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。

>>> classmates = ('Michael', 'Bob', 'Tracy')
>>> classmates
('Michael', 'Bob', 'Tracy')
>>> classmates[1]
'Bob'

注意:由于tuple不可变,所以代码更安全,如果可能,能用tuple代替list就尽量用tuple。
tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,比如:

>>> t = (1, 2)
>>> t
(1, 2)

如果要定义一个空的tuple,可以写成():

>>> t = ()
>>> t
()

但是,要定义一个只有1个元素的tuple,如果你这么定义:

>>> t = (1)
>>> t
1

定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。
所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:

>>> t = (1,)
>>> t
(1,)

Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。
最后来看一个可变的tuple:

>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

注意:tuple所谓的不变是说,tuple的每个元素,指向永远不变。

切片
取一个list或tuple中的部分元素,当然其他语言,例如java也可以使用截取函数,传入区间进行截取,但是Python提供了一个更简单的操作

>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
>>> L[0:3]
['Michael', 'Sarah', 'Tracy']

注意,3表示的不是截取的元素个数,而是索引结束位置,即不包括索引为3的元素,如果开始索引为0,还可以省略

>>> L[1:3]
['Sarah', 'Tracy']
>>> L[:3]
['Michael', 'Sarah', 'Tracy']

前面也提到过,Python取元素还支持L[-1]这种取倒数第一个元素的操作

>>> L[-2:]
['Bob', 'Jack']
>>> L[-2:-1]
['Bob']

L[:],这个表示复制一个list,其实就是默认把整个list切片。

迭代
这个和Java也差不多,在Java中也有迭代器以及foreach(element: elements)这种循环语句,在Python中,使用for ... in。

>>> for ch in 'abc':
...   print ch
... 
a
b
c

默认情况下,dict通过key迭代。也可以通过value来迭代:for value in d.itervalues()。也可以同时迭代key和value:for k, v in d.iteritems()。
所以,只要判断一个对象是可迭代对象就可以使用for ... in这种循环,通过collections模块的Iterable类型判断:

>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False

有时候也需要里列表里的下标,这点Python也提供了一个内置的enumerate函数,可以把一个list变成索引-元素对,这样就可以做到在for循环中迭代索引和元素本身。

>>> for i, value in enumerate(['A', 'B', 'C']):
...   print i, value
... 
0 A
1 B
2 C

还可以同时引用两个变量

>>> for x, y in [(1, 1), (2, 4), (3, 9)]:
...   print x, y
...
1 1
2 4
3 9
Python 相关文章推荐
用于统计项目中代码总行数的Python脚本分享
Apr 21 Python
python常见排序算法基础教程
Apr 13 Python
numpy判断数值类型、过滤出数值型数据的方法
Jun 09 Python
Python使用pymysql从MySQL数据库中读出数据的方法
Jul 25 Python
利用Python将文本中的中英文分离方法
Oct 31 Python
详解Python读取yaml文件多层菜单
Mar 23 Python
详解Python打包分发工具setuptools
Aug 05 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
Jan 14 Python
解决jupyter notebook import error但是命令提示符import正常的问题
Apr 15 Python
python实现密度聚类(模板代码+sklearn代码)
Apr 27 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
May 11 Python
Python特殊属性property原理及使用方法解析
Oct 09 Python
Python中的列表生成式与生成器学习教程
Mar 13 #Python
jupyter安装小结
Mar 13 #Python
Ubuntu下安装PyV8
Mar 13 #Python
Python连接MySQL并使用fetchall()方法过滤特殊字符
Mar 13 #Python
深入讲解Python函数中参数的使用及默认参数的陷阱
Mar 13 #Python
编写Python小程序来统计测试脚本的关键字
Mar 12 #Python
使用Python内置的模块与函数进行不同进制的数的转换
Mar 12 #Python
You might like
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
2018/07/26 Javascript
浅谈js中的bind
2019/03/18 Javascript
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
python 正则式使用心得
2009/05/07 Python
仅利用30行Python代码来展示X算法
2015/04/01 Python
Python使用Beautiful Soup包编写爬虫时的一些关键点
2016/01/20 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
python XlsxWriter模块创建aexcel表格的实例讲解
2018/05/03 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
2019/05/10 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
基于logstash实现日志文件同步elasticsearch
2020/08/06 Python
html5唤醒APP小记
2019/03/27 HTML / CSS
五一服装活动方案
2014/01/11 职场文书
医院见习报告范文
2014/11/03 职场文书
幼儿园父亲节活动总结
2015/02/12 职场文书
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis