2、Python列表和元组
2、Python序列
序列是一种数据存储方式,类似于C语言的数组。简单的说序列是一块用来存储多个值的连续内存空间,同一个序列的元素通常是相关的。
Python中常用的序列结构有列表、元组、字典、字符串、集合等,字典和集合是无序的,其他三个都支持双向索引。一般0为第一个序列,但是python可以用负数做下标序列,最后一个下标为-1,之前的为-2,以此类推。
2.1列表
列表的所有元素放在一堆方括号中相邻元素之间用逗号分开,元素扩充或删除时,列表自动扩充或缩减,但尽量向列表末尾进行增删操作。同一列表中元素类型可以不同,可以是基本类型,也可以是序列类型。
2.1.1列表的创建和删除
创建:a_list=[]空列表
a_list=['a','b','zxlc']
也可以用list()函数将元组、range对象、字符串或其他类型的对象转换成列表例如:
a_list=list((3,5,7,9)) #将元组转换成列表
list(range(1,10,2) #将range对象转换成列表(range函数:第一个参数是起始数,第二个参数是终止数,第三个数是步长)
list('hello world') #将字符串转换成列表
x=list() #创建空列表
删除:del a_list
2.1.2列表元素添加
1、append()方法,在列表末尾添加一个元素
a_list.append(i)
2、+,创建一个新列表,在旧列表后加上这个新列表
a_list=a_list+[i]
3、extend()方法可以将其他元素放在后面
4、insert()方法可以按元素顺序插入元素
5、用乘法来扩展列表对象,将列表与整数相乘,生成一个新序列,新序列是之前序列的重复,相当于另外创建了一个序列(id不同)
2.1.3列表元素删除
1、使用del命令删除列表中的指定位置上的元素。
a_list=[3,5,7,9,11]
del a_list[1]
a_list
[3,7,9,11]
2、pop()方法删除并返回指定位置上的元素(默认为最后一个),如果指定的索引超出了范围,就抛出异常。
3、remove()方法删除首次出现的指定元素,如果列表中不存在这个元素,则抛出异常。
***每次执行完插入和删除操作,元素的索引都会改变
2.1.4列表元素查询和计数
查询可以直接用下标
index()函数可以查看指定元素的索引
count()函数可以计数某元素出现的次数
2.1.5判断元素是否在列表中
用in
3 in a_list
2.1.6切片操作
切片使用两个冒号分隔的三个数字来完成:第一个数字为切片开始位置(默认为0);第二个数字为切片截止(但不包含)位置(默认为列表长度),第三个数字为切片的步长(默认为1),当步长省略时,最后一个冒号也可以省略
例如 aList=[3,4,5,6,7,9,11,13,15,17]
>>>aList[::-1]
[17,15,13,11,9,7,6,5,4,3]
>>>aList[::2]
[3 ,5,7,11,15]
用切片复制列表是一个中浅克隆,而直接列表等号赋值是深克隆。
2.1.7列表排序
利用sort()函数,返回排序后的原列表。
默认为升序:aList.sort()
改为降序:aList.sort(reverse=true)
利用sorted()函数,返回排序后的新列表
2.1.8列表中常用的方法
1、cmp()比较大小
2、len()返回列表长度
3、max()、min()返回列表的最大最小值
4、sum()返回列表值的和
5、zip()将多个列表或元组对应位置的元素组合成为元组并返回包含这些元组的zip对象
alist=[1,2,3]
blist=[4,5,6]
clist=[7,8,9]
dlist=zip[alist,blist,clist]
dlist
[(1,4,7),(2,5,8),(3,6,9]
2.1.9列表推导式
>>>alist=[x*x for x in range(10)]
相当于
>>>alist=[]
>>>for x in range(10):
alist.append(x*x)
2.2元组
元组为不可变序列,元组一旦创建,用任何办法都无法修改其元素的值,也无法增加删除元素,确实需要修改则可以再创建一个元组。放在一对圆括号中。
2.2.1元组创建
a_tuple=('a','b')
如果仅仅创建一个只有一个元素的元组,那么在这个元素后需要加一个逗号,不然会认为是该元素本身。
2.2.2元组删除
del()
2.2.3元组和序列的区别
1、元组不可变,所以不能有增删改元素;序列可变,有许多函数可以增删改元素
2、元组通过tuple()函数可以冻结列表使其不可变;而列表通过list()函数可以融化元组,使其可变。
不过元组中的元素可以包含可变的序列。
2.2.4序列解包
在元组中,可以用序列解包进行多变量同时赋值
>>>x,y,z=1,2,3
>>>print(x,y,z)
在字典中,默认是对字典的键操作,如果需要对键值对操作,需要使用字典的items()方法,如果需要对字典的值操作,则需要使用字典的values()方法指定。
>>>a=[1,2,3]
>>>b,c,d=a
>>>s={'a':1,'b':2,'c':3}
>>>b,c,d=s.itmes()
>>>b
('a',1)
>>>b,c,d=s
>>>b
'a'
>>>b,c,d=s.values()
>>>print(b,c,d)
1 3 2
2.2.5生成器推导式
用圆括号,返回为一个生成器对象,可以将其强转为一个列表或者一个元组,也可以使用生成器对象的_next_()方法进行遍历,或者直接将其作为迭代器对象来使用,不过只能访问一次,还想访问需要重新创建。
>>>g=((i+2)**2 for i in range(10))
这是个生成器对象,意为4,9,16.。。。,121
>>>g.next()
4
>>>g.next()
9