深入解析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完全新手教程
Feb 08 Python
详细介绍Python函数中的默认参数
Mar 30 Python
python魔法方法-属性转换和类的表示详解
Jul 22 Python
python中异常报错处理方法汇总
Nov 20 Python
详解PyCharm配置Anaconda的艰难心路历程
Aug 13 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
Sep 17 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
Apr 17 Python
python删除文件夹下相同文件和无法打开的图片
Jul 16 Python
Python基于Socket实现简单聊天室
Feb 17 Python
Matplotlib使用字符串代替变量绘制散点图的方法
Feb 17 Python
python操作toml文件的示例代码
Nov 27 Python
python 利用PyAutoGUI快速构建自动化操作脚本
May 31 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
php+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
2007/03/07 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
JavaScript 未结束的字符串常量常见解决方法
2010/01/24 Javascript
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
jquery 插件学习(一)
2012/08/06 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
2013/10/21 Javascript
深入理解Javascript中this的作用域
2014/08/12 Javascript
javascript实现分栏显示小技巧附图
2014/10/13 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
JavaScript组件开发完整示例
2015/12/15 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
2016/12/27 Javascript
微信小程序的日期选择器的实例详解
2017/09/29 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
python图像处理之镜像实现方法
2015/05/30 Python
pycharm远程调试openstack代码
2017/11/21 Python
python处理document文档保留原样式
2019/09/23 Python
Python学习之路安装pycharm的教程详解
2020/06/17 Python
Python爬虫设置ip代理过程解析
2020/07/20 Python
建筑工程技术专业求职信
2014/07/16 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
征求意见函
2015/06/05 职场文书
新学期主题班会
2015/08/17 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
《家》读后感:万惜拯救,冷暖自知
2019/09/25 职场文书
PHP基本语法
2021/03/31 PHP
php+laravel 扫码二维码签到功能
2021/05/15 PHP
为什么RedisCluster设计成16384个槽
2021/09/25 Redis
90后经典动画片排行:《数码宝贝》第二,《小鲤鱼历险记》在榜
2022/03/18 日漫
《Estab Life》4月6日播出 正式PV、主视觉图公开
2022/03/20 日漫