1.python序列概述
2.列表
列表(list)是最重要的Python内置对象之一,是包含若干元素的有序连续内存空间。
在形式上,列表的所有元素放在一对方括号[]中,相邻元素之间使用逗号分隔。
在Python中,同一个列表中元素的数据类型可以各不相同,可以同时包含整数、实数、字符串等基本类型的元素,也可以包含列表、元组、字典、集合、函数以及其他任意对象。
如果只有一对方括号而没有任何元素则表示空列表。
[10,
20, 30, 40]
['crunchy
frog', 'ram bladder', 'lark vomit']
['spam',
2.0, 5, [10, 20]]
[['file1',
200,7], ['file2', 260,9]]
[{3},
{5:6}, (1, 2, 3)]
使用“=”直接将一个列表赋值给变量即可创建列表对象。
>>>
a_list = ['a', 'b', 'mpilgrim', 'z', 'example']
>>>a_list = [] #创建空列表
也可以使用list()函数把元组、range对象、字符串、字典、集合或其他可迭代对象转换为列表。
>>> list((3,5,7,9,11)) #将元组转换为列表
[3, 5, 7, 9, 11]
>>> list(range(1, 10, 2)) #将range对象转换为列表
[1, 3, 5, 7, 9]
>>> list('hello world') #将字符串转换为列表
['h', 'e', 'l', 'l', 'o', ' ',
'w', 'o', 'r', 'l', 'd']
>>> list({3,7,5}) #将集合转换为列表
[3, 5, 7]
>>> list({'a':3, 'b':9,'c':78}) #将字典的“键”转换为列表
['a', 'c', 'b']
>>> list({'a':3, 'b':9,
'c':78}.items())#将字典的“键:值”对转换为列表
[('b', 9), ('c', 78), ('a', 3)]
>>>x = list() #创建空列表
创建列表之后,可以使用整数作为下标来访问其中的元素,其中0表示第1个元素,1表示第2个元素,2表示第3个元素,以此类推;列表还支持使用负整数作为下标,其中-1表示最后1个元素,-2表示倒数第2个元素,-3表示倒数第3个元素,以此类推。当一个列表不再使用时,可以使用del命令将其删除。
>>> x = list('Python') #创建类别对象
>>> x
['P', 'y', 't', 'h', 'o', 'n']
>>> x[0] #下标为0的元素,第一个元素
'P'
>>> x[-1] #下标为-1的元素,最后一个元素
'n'_bottomo
>>>
x = [1, 2, 3]
>>>del x #删除列表对象
>>>x #对象删除后无法再访问,抛出异常
NameError:
name 'x' is not defined
列表常用的方法:
(1)append()、insert()、extend()
üappend()用于向列表尾部追加一个元素,insert()用于向列表任意指定位置插入一个元素,extend()用于将另一个列表中的所有元素追加至当前列表的尾部。
>>> x = [1, 2, 3]
>>> x.append(4) #在尾部追加元素
>>> x.insert(0, 0) #在指定位置插入元素
>>> x.extend([5, 6, 7]) #在尾部追加多个元素
>>> x
[0, 1, 2, 3, 4, 5, 6, 7]
(2)pop()、remove()
üpop()用于删除并返回指定位置(默认是最后一个)上的元素;remove()用于删除列表中第一个值与指定值相等的元素。
ü另外,还可以使用del命令删除列表中指定位置的元素。
>>> x = [1, 2, 3, 4, 5, 6, 7]
>>> x.pop() #弹出并返回尾部元素
7
>>> x.pop(0) #弹出并返回指定位置的元素
1
>>> x = [1, 2, 1, 1, 2]
>>> x.remove(2) #删除首个值为2的元素
>>> del x[3] #删除指定位置上的元素
>>> x
[1, 1, 1]
(3)count()、index()
ü列表方法count()用于返回列表中指定元素出现的次数;index()用于返回指定元素在列表中首次出现的位置,如果该元素不在列表中则抛出异常。
>>> x = [1, 2, 2, 3, 3, 3, 4, 4,
4, 4]
>>> x.count(3) #元素3在列表x中的出现次数
3
>>> x.count(5) #不存在,返回0
0
>>> x.index(2) #元素2在列表x中首次出现的索引
1
>>> x.index(5) #列表x中没有5,抛出异常
ValueError: 5 is not in list
(4)sort()、reverse()
列表对象的sort()方法用于按照指定的规则对所有元素进行排序;reverse()方法用于将列表所有元素逆序或翻转。
>>> x = list(range(11)) #包含11个整数的列表
>>> import random
>>> random.shuffle(x) #把列表x中的元素随机乱序
>>> x
[6, 0, 1, 7, 4, 3, 2, 8, 5, 10,
9]
>>> x.sort(key=lambdaitem:len(str(item)), reverse=True) #按转换成字符串以后的长度,降序排列
>>> x
[10, 6, 0, 1, 7, 4, 3, 2, 8, 5,
9]
>>> x.sort(key=str) #按转换为字符串后的大小,升序排序
>>> x
[0, 1, 10, 2, 3, 4, 5, 6, 7, 8,
9]
>>> x.sort() #按默认规则排序
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10]
>>> x.reverse() #把所有元素翻转或逆序
>>> x
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1,
0]
列表对象支持的运算符:
加法运算符+也可以实现列表增加元素的目的,但不属于原地操作,而是返回新列表,涉及大量元素的复制,效率非常低。使用复合赋值运算符+=实现列表追加元素时属于原地操作,与append()方法一样高效。
>>> x = [1, 2, 3]
>>> id(x)
53868168
>>> x = x + [4] #连接两个列表
>>> x
[1, 2, 3, 4]
>>> id(x) #内存地址发生改变
53875720
>>> x += [5] #为列表追加元素
>>> x
[1, 2, 3, 4, 5]
>>> id(x) #内存地址不变
53875720
乘法运算符*可以用于列表和整数相乘,表示序列重复,返回新列表。运算符*=也可以用于列表元素重复,属于原地操作。
>>> x = [1, 2, 3, 4]
>>> id(x)
54497224
>>> x = x * 2 #元素重复,返回新列表
>>> x
[1, 2, 3, 4, 1, 2, 3, 4]
>>> id(x) #地址发生改变
54603912
>>> x *= 2 #元素重复,原地进行
>>> x
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3,
4, 1, 2, 3, 4]
>>> id(x) #地址不变
54603912
成员测试运算符in可用于测试列表中是否包含某个元素,查询时间随着列表长度的增加而线性增加,而同样的操作对于集合而言则是常数级的。
>>>
3 in [1, 2, 3]
True
>>>
3 in [1, 2, '3']
False
关系运算符可以用来比较两个列表的大小。
>>>[1, 2, 4] > [1, 2, 3, 5] #逐个比较对应位置的元素
#直到某个能够比较出大小为止
True
>>>
[1, 2, 4] == [1, 2, 3, 5]
False
2.内置函数对列表的操作
max()、min()函数用于返回列表中所有元素的最大值和最小值,
sum()函数用于返回列表中所有元素之和;
len()函数用于返回列表中元素个数,zip()函数用于将多个列表中元素重新组合为元组并返回包含这些元组的zip对象;
enumerate()函数返回包含若干下标和值的迭代对象;
map()函数把函数映射到列表上的每个元素,filter()函数根据指定函数的返回值对列表元素进行过滤;
all()函数用来测试列表中是否所有元素都等价于True,any()用来测试列表中是否有等价于True的元素。
标准库functools中的reduce()函数以及标准库itertools中的compress()、groupby()、dropwhile()等大量函数也可以对列表进行操作。
>>> x = list(range(11)) #生成列表
>>> import random
>>> random.shuffle(x) #打乱列表中元素顺序
>>> x
[0, 6, 10, 9, 8, 7, 4, 5, 2, 1,
3]
>>> all(x) #测试是否所有元素都等价于True
False
>>> any(x) #测试是否存在等价于True的元素
True
>>> max(x) #返回最大值
10
>>> max(x, key=str) #按指定规则返回最大值
9
>>> min(x)
0
>>> sum(x) #所有元素之和
55
>>> len(x) #列表元素个数
11
>>> list(zip(x, [1]*11)) #多列表元素重新组合
[(0, 1), (6, 1), (10, 1), (9, 1),
(8, 1), (7, 1), (4, 1), (5, 1), (2, 1), (1, 1), (3, 1)]
>>> list(zip(range(1,4))) #zip()函数也可以用于一个序列或迭代对象
[(1,), (2,), (3,)]
>>> list(zip(['a', 'b', 'c'],[1, 2])) #如果两个列表不等长,以短的为准
[('a', 1), ('b', 2)]
>>> enumerate(x) #枚举列表元素,返回enumerate对象
<enumerate object at
0x00000000030A9120>
>>> list(enumerate(x)) #enumerate对象可以转换为列表、元组、集合
[(0, 0), (1, 6), (2, 10), (3, 9),
(4, 8), (5, 7), (6, 4), (7, 5), (8, 2), (9, 1), (10, 3)]
3.切片
在形式上,切片使用2个冒号分隔的3个数字来完成。
[start:end:step]
第一个数字start表示切片开始位置,默认为0;
第二个数字end表示切片截止(但不包含)位置(默认为列表长度);
第三个数字step表示切片的步长(默认为1)。
当start为0时可以省略,当end为列表长度时可以省略,当step为1时可以省略,省略步长时还可以同时省略最后一个冒号。
当step为负整数时,表示反向切片,这时start应该在end的右侧才行。
(1)使用切片获取列表部分元素
使用切片可以返回列表中部分元素组成的新列表。与使用索引作为下标访问列表元素的方法不同,切片操作不会因为下标越界而抛出异常,而是简单地在列表尾部截断或者返回一个空列表,代码具有更强的健壮性。
>>>aList = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
>>>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]
>>>aList[1::2] #隔一个取一个,获取奇数位置的元素
[4,6, 9, 13, 17]
>>>aList[3:6] #指定切片的开始和结束位置
[6,7, 9]
>>> aList[0:100] #切片结束位置大于列表长度时,从列表尾部截断
[3, 4, 5, 6, 7, 9, 11, 13, 15,17]
>>> aList[100] #抛出异常,不允许越界访问
IndexError: list index out of range
>>> aList[100:] #切片开始位置大于列表长度时,返回空列表
[]
>>> aList[-15:3] #进行必要的截断处理
[3, 4, 5]
>>> len(aList)
10
>>> aList[3:-10:-1] #位置3在位置-10的右侧,-1表示反向切片
[6, 5, 4]
>>> aList[3:-5] #位置3在位置-5的左侧,正向切片
[6, 7]
(2)使用切片为列表增加元素
可以使用切片操作在列表任意位置插入新元素,不影响列表对象的内存地址,属于原地操作。
>>>aList = [3, 5, 7]
>>>aList[len(aList):]
[]
>>>aList[len(aList):] = [9] #在列表尾部增加元素
>>>aList[:0] = [1, 2] #在列表头部插入多个元素
>>>aList[3:3] = [4] #在列表中间位置插入元素
>>>aList
[1,2, 3, 4, 5, 7, 9]
(3)使用切片替换和修改列表中的元素
>>> aList = [3, 5, 7, 9]
>>> aList[:3] = [1, 2, 3] #替换列表元素,等号两边的列表长度相等
>>> aList
[1, 2, 3, 9]
>>> aList[3:] = [4, 5, 6] #切片连续,等号两边的列表长度可以不相等
>>> aList
[1, 2, 3, 4, 5, 6]
>>> aList[::2] = [0]*3 #隔一个修改一个
>>> aList
[0, 2, 0, 4, 0, 6]
>>> aList[::2] = ['a', 'b','c'] #隔一个修改一个
>>> aList
['a', 2, 'b', 4, 'c', 6]
>>> aList[1::2] = range(3) #序列解包的用法
>>> aList
['a', 0, 'b', 1, 'c', 2]
>>> aList[1::2] = map(lambda x:
x!=5, range(3))
>>> aList
['a', True, 'b', True, 'c', True]
>>> aList[1::2] = zip('abc',
range(3)) #map、filter、zip对象都支持这样的用法
>>> aList
['a', ('a', 0), 'b', ('b', 1),
'c', ('c', 2)]
>>> aList[::2] = [1] #切片不连续时等号两边列表长度必须相等
ValueError: attempt to assign
sequence of size 1 to extended slice of size 3
(4)使用切片删除列表中的元素
>>> aList = [3, 5, 7, 9]
>>> aList[:3] = [] #删除列表中前3个元素
>>> aList
[9]
也可以结合使用del命令与切片结合来删除列表中的部分元素,并且切片元素可以不连续。
>>> aList = [3, 5, 7, 9, 11]
>>> del aList[:3] #切片元素连续
>>> aList
[9, 11]
>>> aList = [3, 5, 7, 9, 11]
>>> del aList[::2] #切片元素不连续,隔一个删一个
>>> aList
[5, 9]