python列表与元组详解实例


Posted in Python onNovember 01, 2013

在这章中引入了数据结构的概念。数据结构是通过某种方式组织在一起的数据元素的集合。在python中,最基本的数据结构就是序列。序列中的每个元素被分配一个序号,即元素的位置,也被称为索引。注意:第一个索引是0。
1.序列概览
python有6种内建的序列:列表,元组,字符串,Unicode字符串,buffer对象和xrange对象。
 这里重点介绍列表和元组。列表和元组主要区别在于,列表可以修改,元组不可修改。一般来说,在几乎所有情况下列表都可以代替元组。
在需要操作一组数值的时候,序列很好用:

Edward = ["Gumby",42]

 同时,序列可以包含其他的序列。如:
Edward = ["Gumby",42]
John = ["Smith",50]
database = [Edward,John]

2. 通用序列操作
所有序列类型都可以进行某些特点的操作,包括:索引,分片,加,乘以及检查某个元素是否属于序列的成员(成员资格)。除此之外,python还有计算序列长度,找出最大元素和最小元素的内建函数。
2.1 索引
序列中的所有元素都是有编号的--从0开始递增。这些元素可以通过编号分别访问:
>>>greeting = "hello"
>>>greeting[0]
'H'

使用负数索引的话,python会从右边,也就是从最后一个元素开始计数,最后一个元素的位置编号是-1!
>>> greeting[-1]
'g'

2.2 分片
分片可以访问一定范围内的元素,通过冒号相隔的2个索引来实现。分片对于提取序列的一部分是很有用的,第一个索引是提取部分的第一个元素编号,最后的索引是分片之后剩下部分的第一个元素编号。
>>> number = [1,2,3,4,5,6,7,8,9,10]
>>> number[3:6]
[4,5,6]
>>> number[0:1]
[1]

2.2.1 优雅的捷径
需要访问最后3个元素,可以这样显式操作:
>>> number[7:10]
[8,9,10]

这里索引10指向的第11个元素不存在,却是在最后一个元素之后。
如果需要从列表结尾开始计数,就是说如果分片所得部分包括序列结尾的元素,那么只需置空最后一个索引:
>>> number[-3:]
[8,9,10]

这种方法适用于序列开始的元素或者显示整个序列:
>>> number[:3]
[1,2,3]
>>> number[:]
[1,2,3,4,5,6,7,8,9,10]

2.2.2 更大的步长
进行分片的时候,分片的开始和结束都需要进行指定,另一个参数-步长,通常是隐式设置的。默认的步长是1。如果显示设置步长为比1大的数,那么会跳过某些元素。
>>> number[0:10:2]
[1,3,5,7,9]
>>> number[3:6:3]
[4]

步长不能为0,但是可以是负数,即从右到左提取元素:
>>> number[10:0:-2]
[10,8,6,4,2]
>>> number[0:10:-2]
[]

上面第二个式子是错误的,使用一个负数作为步长时,必须让开始点大于结束点。
2.3 序列相加
通过使用加号可以进行序列的连接操作:
>>> [1,2,3] + [4,5,6]
[1,2,3,4,5,6]
>>>'hello, ' + 'world'
'hello, world'
>>>[1,2,3] + 'hello'
TypeError:can only concatenate list(not 'string') to list

如上面第三个例子所示,列表和字符串是无法连接到一块的,尽管它们都是序列,但是只有2种相同类型的序列才能进行连接操作。
2.4 乘法
用数字x乘以一个序列会生成新的序列,在新的序列中,原来的序列被重复x次:
[code]
>>> 'python' *5
'pythonpythonpythonpythonpython'
>>> [42] * 5
[42,42,42,42,42]

None,空列表和初始化
空列表可以通过2个中括号进行表示([]),但是如果想创建一个占用十个元素空间,却不包括任何有用内容的列表,我们就需要一个值来代表空值,可以这样做:
>>> sequence = [None] * 10
>>> sequence 
[None,None,None,None,None,None,None,None,None,None]

2.5 成员资格
为了检查一个值是否在序列中,可以使用in运算符。它检查某个条件是否为真,然后返回相应的值(True或False)
>>> p = 'write'
>>> 'w' in p
True
>>> user =["a","b","c"]
>>> raw_input('Enter:') in user
Enter:a
True

2.6 长度,最大最小值
>>> numbers = [10,20,30]
>>> len(numbers)
>>> max(numbers)
>>> min(numbers)
>>> max(1,99)
>>> min(1,99)

上面最后2个例子中,max函数和min函数的参数并不是序列,而是以多个数字直接作为参数。
3.列表:python的“苦力”
3.1 list函数
因为字符串不能像列表一样被修改,所以有时候根据字符串创建列表会很有用。ps:list函数适用于所有类型的列表,不只是字符串。
>>> list('hello')
['h','e','l','l','o']

提示:可以用下面的表达式将一个由字符组成的列表转换为字符串:
>>> strs = ‘ '.jion(list)
>>> strs
"h e l l o"

3.2 基本列表操作
方法是一个与某些对象有紧密联系的函数,对象可能是列表,数字,也可能是字符串或者其他类型的对象。列表提供了几个方法,用于检测或者修改其中的内容。
 3.2.1 append
append方法用于在列表末尾追加新的对象:
>>> lst = [1,2,3]
>>> lst.append(4)
>>> lst
[1,2,3,4]

注意:append方法不是简单地返回一个修改过的新列表,而是直接修改原来的列表。

3.2.2 count
count方法统计某个元素在列表中出现的次数:

>>> x =[[1,2],1,1,[1,2,[1,2]]]
>>> x.count(1)
2

3.2.3 extend
extend方法可以在列表的末尾一次性追加另一个序列中的多个值。
注意:extend方法和连接操作(+)最主要的区别在于:extend方法修改了被扩展的序列,而连接操作会返回一个全新的列表。

3.2.4 index
index方法用于从列表中找出某个值第一次匹配项的索引位置:

>>> knights = ['we','are','the','knights']
>>> knights.index('the')
2
>>> knights.index("hi")
ValueError:list.index(x):x not in list

当匹配项没有被找到时,会引发一个异常。

3.2.5 insert
insert方法用于将对象插入到列表中:

>>> numbers = [1,2,3,6]
>>> numbers = insert(3,5)
>>> numbers
[1,2,3,5,6]
>>> numbers[3:3] = [4]
>>> numbers
[1,2,3,4,5,6]

上面最后一个例子中通过分片赋值实现插入,但是可读性不如insert。

3.2.6 pop
pop方法会移除列表中的一个元素,并且放回该元素的值,它是唯一一个既能修改列表又能返回元素值的列表方法:

>>> x = [1,2,3]
>>> x.pop()
3
>>> x
[1,2]

3.2.7 remove
 remove方法用于移除列表中某个值的第一个匹配项:
>>> x = ['to','be','to']
>>> x.remove('to')
>>> x
['be','to']
>>> x.remove('kkk')
ValueError:list.remove(x):x not in list

可以看到只有第一次出现的值被移除了,而不在列表中的值是不会移除的。

 3.2.8 reverse
reverse方法将列表中的元素反向存放:

>>> x = [1,2,3]
>>> x.reverse()
>>> x
[3,2,1]

 3.2.9 sort
sort方法用于在原位置对列表进行排序,意味着改变原来的列表,而不是简单地返回一个已排序的列表副本。
如果想要得到一个排序而不改变原来的数值,那就需要先赋值再排序:
>>> x = [4,2,7,1]
>>> y = x[:]
>>> y.sort()
>>> x
[4,2,7,1]
>>>y
[1,2,4,7]

注意:上面的例子中赋值使用的是y=x[:],分片是一种很有效率的复制整个列表的方法。如果简单地把x赋值给y是没有的(y=x),因为这样做就让x和y指向同一个列表了。
另一种获取已排序列表副本的方法是使用sorted函数:
>>> x = [4,5,3,7,2]
>>> y = sorted(x)
>>> x
[4,5,3,7,2]
>>> y
[2,3,4,5,7]
 

 3.2.10 高级排序
如果希望元素能够按照特定的方式进行排序,那么可以通过compare(x,y)的形式自定义比较函数。内建cmp函数提供了比较函数的默认实现方式:
>>> cmp(1,2)
-1
>>> cmp(2,1)
>>> cmp(1,1)
>>> numbers = [5,3,9,7]
>>> numbers.sort(cmp)
>>> numbers 
[3,5,7,9]

sort方法有另外2个可选参数-key和reverse。要使用它们,那就要通过名字来指定。
>>> x = ['a','abc','ab']
>>> x.sort(key=len)
>>> x
['a','ab','abc']
>>> y = [2,4,1,5]
>>> y.sort(reverse)
>>> y
[5,4,2,1]

 4.元组:不可变序列
 创建元组的语法很简单:如果你用逗号分隔了一些值,那么你就自动创建了元组。

>>>1,2,3
(1,2,3)
>>>(1,2,3)
(1,2,3)
>>>()
()
>>>42,
(42,)

如上面最后一个例子,如果要实现一个包括一个值的元组,必须在数值后面加一个逗号。
4.1 tuple函数
tuple将一个序列作为参数并把它转换为元组,如果参数是元组,那么该参数就会被原样返回:
>>> tuple([1,2,3])
(1,2,3)
>>> tuple('abc')
('a','b','c')
>>> tuple((1,2,3))
(1,2,3)

4.2 基本元组操作
元组其实并不复杂,除了创建元组和访问元组元素之外,也没有太多其他操作:
>>>x = 1,2,3
>>>x[1]
2
>>> x[0:2]
(1,2)

元组的分片还是元组,就像列表的分片还是列表一样。

4.3 那么,意义何在
元组是不可替代的:
(1)元组可以在映射中当作键使用,而列表不行。
(2)元组作为很多内建函数和方法的返回值存在。

 

Python 相关文章推荐
Python Web框架Flask中使用新浪SAE云存储实例
Feb 08 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
利用python画出折线图
Jul 26 Python
python模块导入的细节详解
Dec 10 Python
Django用户认证系统 组与权限解析
Aug 02 Python
在Python中预先初始化列表内容和长度的实现
Nov 28 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
Python跑循环时内存泄露的解决方法
Jan 13 Python
Python flask框架实现查询数据库并显示数据
Jun 04 Python
利用python汇总统计多张Excel
Sep 22 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
Feb 20 Python
Anaconda配置各版本Pytorch的实现
Aug 07 Python
python创建和使用字典实例详解
Nov 01 #Python
python分割和拼接字符串
Nov 01 #Python
python list语法学习(带例子)
Nov 01 #Python
python读取Android permission文件
Nov 01 #Python
Python读写Excel文件的实例
Nov 01 #Python
Python修改Excel数据的实例代码
Nov 01 #Python
Python获取apk文件URL地址实例
Nov 01 #Python
You might like
php的header和asp中的redirect比较
2006/10/09 PHP
PHP strtotime函数用法、实现原理和源码分析
2015/02/04 PHP
PHP函数import_request_variables()用法分析
2016/04/02 PHP
PHP查看SSL证书信息的方法
2016/09/22 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
javascript下利用arguments实现string.format函数
2010/08/24 Javascript
js indexOf()定义和用法
2012/10/21 Javascript
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
jQuery插件实现图片轮播特效
2016/06/16 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
flask框架url与重定向操作实例详解
2020/01/25 Python
python画环形图的方法
2020/03/25 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
Django url 路由匹配过程详解
2021/01/22 Python
模具设计与制造专业应届生求职信
2013/10/18 职场文书
给排水工程师岗位职责
2013/11/21 职场文书
社会学专业学生职业规划书
2014/02/07 职场文书
计算机求职信
2014/07/02 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
检讨书范文500字
2015/01/28 职场文书
工程部经理岗位职责
2015/02/02 职场文书
社区法制宣传月活动总结
2015/05/07 职场文书
吧主申请感言怎么写
2015/08/03 职场文书
大学三好学生主要事迹范文
2015/11/03 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android