1、序列
1.1序列简介
所谓序列,即元素的有序排列。序列中每个位置的元素都有其对应的唯一编号,也就是说我们可以通过元素的位置标识,去搜索到该元素。python中的内建序列有6种:列表、元祖、字符串、Unicode字符串、xrange对象、buffer对象,其中列表和元祖是最常见的序列,应重点掌握。字符串在文章中已简单介绍,下面将以字符串为例,对序列的通用操作进行详讲。
1.2序列通用操作
索引(indexing)
序列的索引即上文介绍的序列中元素的位置标识,按标识顺序分为正向递增序号(简称正序)和逆向递减序号(简称逆序)。正序标识即由左往右,索引从0开始递增,索引为0表示第一个元素,索引为1表示第二个元素,以此类推。以变量x=HELLOWORLD!为例:
逆序标识即由右往左,索引从-1开始,索引为-1表示逆序第一个元素,索引为-2表示逆序第二个元素,以此类推。以字符串HELLOWORLD!为例:
根据字符串的索引,我们可以提取出对应位置上的元素,例如需要提取字符R,可以使用正索引即x[8]去提取,也可以使用逆索引即x[-4]去提取。
x=HELLOWORLD!#正序提取x[8]#逆序提取x[-4]
以上代码执行结果为:
切片(sliceing)
使用索引提取序列元素不需要新创建变量,非常方便,但使用索引每次只能提取字符串中的单个字符,而实际运用中往往需要一次提取多个字符,这时便可以使用序列的另一特性:切片。切片是指通过序列的索引提取出指定范围内的元素作为新的序列。
语法:obj[startindex:endindex:step]
obj:变量名
start_index:[可选参数],切片起始索引,默认为0(正序)或-1(逆序)
end_index:[可选参数],切片结束索引,默认为最后一个元素对应索引(正序),或第一个元素对应索引(逆序)
step:切片步长,默认为1
注意:序列中切片取值范围为左闭右开,即包含起始索引,不包含结束位置。
x=HELLOWORLD!
############提取字符LLO###########
x[2:5:1]#使用正索引
x[-10:-7:1]#使用负索引
x[2:5]#步长为1时可省略参数step
############提取字符WRD###########
x[6:11:2]#使用正索引,步长为2
x[-6:-1:2]#使用负索引,步长为2
############提取字符LRO###########
x[-3:-6:-1]#使用负索引,逆序提取
x[9:6:-1]#使用正索引,逆序提取
############正序提取所有字符##########
x[::]#三个参数皆可省略
############逆序提取所有字符##########
x[::-1]#步长为-1,不可省略
注意:正序提取时,起始索引应小于结束索引;逆序提取时,起始索引应大于结束索引,否则返回值为空序列[]。
相加(adding)
序列中类型相同的序列可以进行加法操作,即把两个或多个序列拼接起来,注意不是数值上的加法运算(元素为数字型时容易混淆)。
x1=talkischeapx2=,x3=showmethecodeprint(x1+x2+x3)
以上代码执行结果为:
相乘(multiplying)
类似于数学运算上的乘法运算,一个序列乘上一个正整数n,相当于将该字符串重复n次连接成一个新序列。
x=pythonprint(x*3)
以上代码执行结果为:
元素存在判断
使用python的关键字“in”或“notin”,可以判断指定元素是否存在该序列中或是否不存在该序列中,满足条件则返回True,不满足条件则返回False。
x=pythontinxiinx
以上代码执行结果为:
序列相关BIF
len():返回序列所含元素的数量
max():返回元素中的最大值
min():返回元素中的最小值
x=pythonlen(x)max(x)min(x)
当序列中元素的类型是字符串型时,使用max()或min()将对字符串进行按位比较,即对字符串中各元素的ascii码进行比较,输出最大值或最小值。
2、列表
在对序列有了大体的认识后,现在开始介绍序列中最具代表性的数据类型——列表。
python中列表以中括号[]为标识,将一个或多个元素(以逗号分隔)括起来为一个列表,其元素可以为python中任意一种数据类型包括列表本身,且各元素不需要具备相同的数据类型。列表可以简单理解为我们日常生活中超市每天的购物记录,其中每个人的购物记录为列表中的元素,每个人可以购买不同类型的物品,且购买数量往往不一致。
#创建列表x_listx_list=[,python,[a,b,c]]print(x_list)
以上代码执行的结果为:
除了上面1.2节介绍的序列通用操作外,列表还有其他一些比较常用的操作。
2.1元素的更新
2.1.1元素的修改
列表通过直接对元素的索引位置赋新值来修改元素。
语法:变量名[需修改元素的索引]=新值
#将变量x_list索引为0的元素修改为x_list[0]=print(x_list)
以上代码执行结果为:
2.1.2元素的删除
列表通过对元素的索引位置,使用del语句来删除列表的元素。
del列表名[需删除元素的列表]
#删除变量x_list索引为1的元素delx_list[1]print(x_list)
以上代码执行结果为:
2.2常用方法
2.2.1元素的增加
append():在列表最后添加一个新的元素语法:列表名.append(添加的元素)#在列表x_list最后添加元素MySQLx_list.append(MySQL)print(x_list)以上代码执行结果为:注意:若添加的新元素为列表,append()会保存其列表形式添加到最后#在列表x_list最后添加元素[MySQL,SPSS]x_list=[,python,[a,b,c]]x_list.append([MySQL,SPSS])print(x_list)以上代码执行结果为:extend():在列表最后添加一个新列表内的多个元素语法:列表名.extend(添加的列表)与方法append()不同,extend()中添加的元素只能是列表类型,且不保存其列表形式,即将需要添加的列表里的元素一一提取出来后再添加到原列表。x_list=[,python,[a,b,c]]x_list.extend([MySQL,SPSS])print(x_list)以上代码执行的结果为:insert():根据指定索引插入新的元素语法:列表名.insert(插入位置的索引,插入的元素)#在变量索引为1的位置插入元素MySQLx_list=[,python,[a,b,c]]x_list.insert(1,MySQL)print(x_list)以上代码执行结果为:2.2.2元素的删除
pop():删除指定索引(默认为-1)对应的元素,并返回所删除的值语法:列表名.pop(索引值)#删除变量中索引为1的元素x_list=[,python,[a,b,c]]x_list.pop(1)print(x_list)以上代码执行结果为:remove():删除指定元素,若匹配到多项,仅删除匹配到的第一项语法:列表名.remove(需删除的元素)#删除指定元素a,仅删除匹配到的第一项z_list=[a,b,c,a]z_list.remove(a)print(z_list)以上代码执行结果为:clear():清空列表里所有元素,返回一个空列表语法:列表名.clear()#清空变量x_list的所有元素x_list=[,python,[a,b,c]]x_list.clear()print(x_list)以上代码执行结果为:2.2.3元素的查找
index():查找元素首次出现位置对应的正索引语法:列表名.index(查找的元素,起始索引,结束索引)#查找元素python在变量x_list中首次查找到位置的索引x_list=[,python,[a,b,c]]x_list.index(python)以上代码执行的结果为:注意:若查找的元素不在该列表中会报错误提示。count():查找元素在该列表中出现的次数语法:列表名.count(查找的元素)#查找元素python在变量x_list中出现的次数y_list=[2,3,4,5,2,2,3]y_list.count(2)以上代码执行结果为:注意:列表中没有方法find()。2.2.4元素的排序
sort():对列表元素进行排序,返回元素按升序(默认)或降序排列的列表语法:列表名.sort(reverse=True/False)reverse:可选参数,默认为True即升序,若为False即降序#对变量y_list的元素进行降序排列y_list=[2,3,4,5,2,2,3]y_list.sort(reverse=True)print(y_list)以上代码执行结果为:reverser():将列表内元素按逆序排列语法:列表名.reverser()#对y_list的元素进行逆序排列y_list=[2,3,4,5,2,2,3]y_list.reverser()print(y_list)以上代码执行结果为:2.2.5列表的复制
copy():用于复制列表用法:列表名.copy()y_list=[2,3,4,5,2,2,3]y=y_list.copy()print(y)
以上代码执行结果为:
注意区分赋值、浅复制copy()、深复制deepcopy():
赋值:对象的简单引用浅复制:复制列表的父对象,但不复制对象内部的子对象深复制:复制列表的父对象及子对象,需先导入copy模块2.3常用内置函数
除了序列通用的内置函数:len()、max()、len(),列表还含有以下内置函数:
list():将其他类型强制转化为列表zip():将多个列表或元祖(后续会介绍)对应位置的元素组合为元祖,返回zip对象enumerate():将一个可遍历对象(如列表、字符串)组合成一个含数据和数据索引的序列3、元祖
3.1元祖简介
元祖与列表一样是python的一种序列类型,可以使用序列的所有通用操作。元祖在python中以小括号“()”为标识,将一个或多个元素(以逗号分隔)括起来为一个元祖,其用法与列表非常类似,二者主要区别在于,列表内的元素可以修改,元祖内的元素不能修改,可以简单把元祖理解为列表的一个“可读版本”。
#元祖的创建x_tuple=(a,2,[3,4])print(x_tuple)#元素修改会报错x_tuple[1]=3
以上代码执行结果为:
注意:创建只有一个元素的元祖时,需要在后面加一个逗号,否则会返回元素本身。因为在python中小括号“()”同时也是数学运算上的一个基本符号,如(1+1)^2,如果创建只有一个元素的元祖时不加逗号分隔,python解释器会将小括号识别为数学运算符号。
y_tuple=(,)print(y_tuple)z_tuple=(,)print(z_tuple)
以上代码执行结果为:
3.2常用方法及内置函数
3.2.1常用方法
由于元祖的元素不可变性,元祖无法对元素进行增加、删除、排序及复制操作,元祖中元素的查找与上述列表中用法一致。
x_tuple=(a,2,[3,4])#元素的查找x_tuple.index(a)#元素的复制x_tuple.count(2)
以上代码执行的结果为:
注意:当元祖中所含元素为列表(可变序列)时,该列表嵌套项是可变的。
x_tuple=(a,2,[3,4])#修改列表[3,4]中的元素,元祖也随之变化x_tuple[2][1]=3print(x_tuple)
以上代码执行结果为:
3.2.2常用内置函数
len(tuple):返回元祖元素的个数max(tuple):返回元祖元素最大值min(tuple):返回元祖元素最小值tuple(seq):将序列转换为元祖3.2.3选择元祖or列表
特点:列表:动态存储,长度大小可变,可对元素进行增删查改等操作,但储存内存较大,性能偏差;元祖:静态存储,长度大小固定,不可随意更新数据,内存占用空间小,处理速度快;使用场景:列表:需随时对数据进行更改,不考虑性能;元祖:1.数据需要被“锁定”,不能随意更改;2.对性能有要求,如遍历;3.作为数据结构的一部分,如字典的key