深入解析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 相关文章推荐
wxPython中listbox用法实例详解
Jun 01 Python
两个命令把 Vim 打造成 Python IDE的方法
Mar 20 Python
使用Python的Flask框架来搭建第一个Web应用程序
Jun 04 Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 Python
对python字典过滤条件的实例详解
Jan 22 Python
python使用celery实现异步任务执行的例子
Aug 28 Python
基于python实现对文件进行切分行
Apr 26 Python
Python实现数字的格式化输出
Aug 01 Python
详解python tcp编程
Aug 24 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
Oct 29 Python
python 制作磁力搜索工具
Mar 04 Python
Python first-order-model实现让照片动起来
Jun 25 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将时间差转换为字符串提示
2011/09/07 PHP
PHP编写RESTful接口的方法
2016/02/21 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
JSON JQUERY模板实现说明
2010/07/03 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
Angular2 多级注入器详解及实例
2016/10/30 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
2018/08/14 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
深入了解JavaScript代码覆盖
2019/06/13 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
Python生成数字图片代码分享
2017/10/31 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
对numpy 数组和矩阵的乘法的进一步理解
2018/04/04 Python
python爬取个性签名的方法
2018/06/17 Python
python迭代dict的key和value的方法
2018/07/06 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
python 模块导入问题汇总
2021/02/01 Python
HTML5新标签兼容——&gt; 的两种方法
2018/09/12 HTML / CSS
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
学生干部学习的自我评价
2014/02/18 职场文书
新颖的化妆品活动方案
2014/08/21 职场文书
新生儿未入户证明
2015/06/23 职场文书
Javascript webpack动态import
2022/04/19 Javascript