在Python中有六种内建的序列:列表、元组、字符串、Unicode字符串、buffer对象和xrange对象。在这里暂时只讨论列表和元组。列表和元组的主要区别在于:列表可以修改,元组(不可变)不能。
所有的序列都可以进行某些特定的操作。这些操作包括:
索引(indexing) 分片(sliceing) 加(adding) 乘(multiplying) 检查某个元素是否属于这序列(index) 计算序列长度(len) 找出最大元素和最小元素(min/max) 1.1索引序列中所有元素都是有编号的,索引从0开始递增。使用负数索引时,Python会从右边开始计数(-1指的是序列最右边的元素)
1#--coding:utf-8-- 2fruit=apple 3#输出:a 4printfruit[0] 5#输出:e 6printfruit[-1] 1.2分片除了可以使用索引访问当个元素,还可以使用分片操作来访问一定范围内元素。分片操作需要两个索引来作为边界,第一个索引的元素是包含在分片内的,而第二个则不包含(这是Python的惯例)。
1#--coding:utf-8-- 2numbers=[1,2,3,4,5,6,7,8,9,10] 3 4#输出:[4,5,6] 5printnumbers[3:6] 6 7#输出:[2,3,4,5] 8printnumbers[1:-5]1.2.1序列分片语法糖
分片中的第二个索引是不包含在返回的分片内的,如果我们需要将一个序列最后的元素包含在分片中该如何操作呢?很简单:
1#--coding:utf-8-- 2numbers=[1,2,3,4,5,6,7,8,9,10] 3 4#输出:[8,9,10] 5#注意:序列中最大的索引为9,而分片中的第二个索引为10 6printnumbers[7:10]Python同时为提供了为序列进行分片的语法糖,如下示例:获取最后3位元素:
1#--coding:utf-8-- 2numbers=[1,2,3,4,5,6,7,8,9,10] 3 4#输出:[8,9,10] 5printnumbers[-3:]获取序列前3个元素:
1#--coding:utf-8-- 2numbers=[1,2,3,4,5,6,7,8,9,10] 3 4#输出:[1,2,3] 5printnumbers[:3]获取整个序列:
1#--coding:utf-8-- 2numbers=[1,2,3,4,5,6,7,8,9,10] 3 4#输出:[1,2,3,4,5,6,7,8,9,10] 5printnumbers[:]1.2.2分片中的步长
在进行分片的时候开始和结束点需要进行指定(显式或隐式)。而另一个参数——步长(setplength)通常都是隐式设置的,默认值为1。如果步长为1:分片操作就是按照这个步长逐个遍历序列的元素,然后返回开始和结束点之间的所有元素。例如,下面两个表达式输出的值相等:
1#--coding:utf-8-- 2numbers=[1,2,3,4,5,6,7,8,9,10] 3 4#输出:[1,2,3,4,5,6,7,8,9,10] 5printnumbers[0:10:1] 6 7#输出:[1,2,3,4,5,6,7,8,9,10] 8printnumbers[0:10]步长也支持下面的简写形式:
1#--coding:utf-8-- 2numbers=[1,2,3,4,5,6,7,8,9,10] 3 4#输出:[1,5,9] 5printnumbers[::4]步长不能为0,但是可以为负数——即从右到左提取元素。使用一个负数作为步长时,必须让开始点(开始索引)大于结束点。如下:
1#--coding:utf-8-- 2numbers=[1,2,3,4,5,6,7,8,9,10] 3 4#输出:[7,6,5] 5printnumbers[6:3:-1] 6 7#输出:[10,8,6,4,2] 8printnumbers[::-2] 9 10#输出:[6,4,2] 11printnumbers[5::-2] 12 13#输出:[10,8] 14printnumbers[:5:-2] 1.3序列相加可以使用加号对两个类型相同的序列进行连接操作,如下:
1#--coding:utf-8-- 2numbers1=[1,2,3] 3numbers2=[4,5,6] 4 5#输出:[1,2,3,4,5,6] 6printnumbers1+numbers2 1.4乘法使用数字n乘以一个序列会生成新的序列,在新的序列中,原来的序列将被重复n次。初始化一个长度为10的列表,每个元素的值为None(None为Python内建值,表示:这里什么也没有)可以这样:
1#--coding:utf-8-- 2sequence=[None]*10 3 4#输出:[None,None,None,None,None,None,None,None,None,None] 5printsequence 1.5成员资格可以使用in运算符判断一个对象是否为某个序列的成(元素),如下:
1#---coding:utf-8--- 2permissions=rw 3fruits=[apple,peach,grape] 4 5#输出:True 6printwinpermissions 7 8#输出:True 9printappleinfruits 10 11#输出:False 12printorangeinfruits 1.6长度、最小值和最大值Python的内建函数:len/min/max的作用分别是:返回序列中包含元素的数量,返回序列中最小和最大元素。如下:
1#--coding:utf-8-- 2numbers=[-1,21,89] 3 4#输出:3 5printlen(numbers) 6 7#输出:-1 8printmin(numbers) 9 10#输出:89 11printmax(numbers)列表是可变的(mutable),且提供很多有用的函数。
2.1list函数通过使用list函数可以将字符串转换为一个序列。(注意:list函数适用于所有类型的序列,而不只是字符串),如下:
1#--coding:utf-8-- 2python=list(python) 3 4#输出:[p,y,t,h,o,n] 5printpython 2.2基本的列表操作列表可以使用所有适用于序列的标准操作,如索引、分片、连接和乘法。
改变列表:元素赋值
1#---coding:utf-8--- 2x=[1,1,1] 3 4#改变索引1元素的值 5x[1]=2 6 7#输出2 8printx[1]删除元素
1#--coding:utf-8-- 2fruits=[apple,orange,banana] 3 4#使用del语句删除元素 5delfruits[1] 6 7#输出:[apple,banana] 8printfruits分片赋值
通过分片赋值可以:一次为多个元素赋值、插入元素、删除元素,如下:
1#--coding:utf-8-- 2name=list(perl) 3#输出:[p,e,r,l] 4printname 5 6#一次为多个元素赋值 7name[2:]=list(ar) 8 9#输出:[p,e,a,r] 10printname 11 12#通过分片赋值插入元素 13numbers=[1,5] 14numbers[1:1]=[2,3,4] 15 16#输出:[1,2,3,4,5] 17printnumbers 18 19#通过分片赋值删除元素 20numbers[1:4]=[] 21 22#输出:[1,5] 23printnumbers 2.3列表方法更多列表的使用方法和API,请参考Python文档:http://docs.python.org/2/library/functions.html#list
append:用于在列表末尾追加新对象:
1#--coding:utf-8-- 2 3#append函数 4lst=[1,2,3] 5lst.append(4) 6#输出:[1,2,3,4] 7printlstcount:用于统计某个元素在列表中出现的次数:
1#count函数 2temp_str=[to,be,not,to,be] 3#输出:2 4printtemp_str.count(to)extend:可以在列表末尾一次性追加另一个序列中的多个值,和连接操作不同,extend方法是修改了被扩展的序列(调用extend方法的序列),而原始的连接操作返回的是一个全新的列表
1#extend函数 2a=[1,2,3] 3b=[4,5,6] 4a.extend(b) 5#输出:[1,2,3,4,5,6] 6printa 7#输出:[1,2,3,4,5,6,7,8,9] 8printa+[7,8,9] 9#输出:[1,2,3,4,5,6] 10printaindex:用于从列表中找出某个值第一个匹配项的索引位置
1#index函数 2knights=[we,are,the,knights,who,say,ni] 3#输出:4 4printknights.index(who) 5#抛出异常:ValueError:meisnotinlist 6printknights.index(me)insert:用于将对象插入到列表中
1#insert函数 2numbers=[1,2,3,5,6] 3numbers.insert(3,four) 4#输出:[1,2,3,four,5,6] 5printnumberspop:移除列表中的一个元素(默认是最后一个),并且返回该元素的值。通过pop方法可以实现一种常见的数据结构——栈(LIFO,后进先出)。
1#pop函数 2x=[1,2,3] 3x.pop() 4#输出:[1,2] 5printx 6y=x.pop(0) 7#输出:[2] 8printx 9#输出:1 10printyremove:移除列表中某个值的第一个匹配项
1#remove函数 2x=[to,be,not,to,be] 3x.remove(to) 4#输出:[be,not,to,be] 5printx 6#移除列表没有的元素会抛出异常 7x.remove(too)reverse:将列表中的元素反向存放
1#reverse函数 2x=[1,2,3] 3x.reverse() 4#输出:[3,2,1] 5printxsort:对列表进行排序。注意:sort函数时没有返回值的(None),它作用于源序列。可以通过sorted函数来获取已排序的列表副本。
1#sort函数 2x=[3,1,2,7,6,9,5,4,8] 3y=x[:] 4z=x 5y.sort() 6#输出:[3,1,2,7,6,9,5,4,8] 7printx 8#输出:[1,2,3,4,5,6,7,8,9] 9printy 10#输出:[3,1,2,7,6,9,5,4,8] 11printzcmp(x,y):通过自定义比较函数(compare),可以实现自定义排序
元组和列表最大的区别在于:元组不能修改。
3.1创建元组创建元组很简单,只需要将元素用括号(可选)括起来,并使用逗号分隔符(即使只有一个元素)来分隔各个元素即可:
1#--coding:utf-8-- 2fruits=(apple,orange,banana) 3none_tuple=() 4fruits_1=(apple,) 5 6#输出:<typetuple> 7printtype(fruits) 8printtype(none_tuple) 9printtype(fruits_1) 3.2使用tuple函数通过tuple函数可以将一个序列转换为元组。如下:
1#--coding:utf-8-- 2temp_tuple=tuple([1,2,3]) 3 4#输出:(1,2,3) 5printtemp_tuple 6#输出:(a,b,c) 7printtuple(abc) 3.3基本元组操作由于元组是不可变的,所有没有提供像列表一样的函数,基本元组操作就是创建和访问。同样,元组作为序列的一种,也支持分片:
1#--coding:utf-8-- 2temp_tuple=tuple([1,2,3]) 3 4#输出:1 5printtemp_tuple[0] 6#输出:(1,2) 7printtemp_tuple[0:2] 3.4那些地方需要使用元组 元组可以在映射(和集合的成员)中作为键(key)使用,而列表不行 元组作为很多内建函数和方法的返回值存在《Python基础教程》
《LearnPythonTheHardWay,2ndEdition》
http://www.pythondoc.com/pythontutorial27/index.html
本文内容总结:序列概览,1.通用序列操作,2.列表,3.元组:不可变序列,参考资料&进一步阅读,
原文链接:https://www.cnblogs.com/IPrograming/p/Python_list_tuple.html