1、序列简介
序列是一种数据存储方式,用来存储一系列的数据。在内存中,序列就是一块用来存放多个值的连续的内存空间。比如一个整数序列[10,20,30,40],可以这样示意表示:

a = [10,20,30,40] 在内存中实际是按照如下方式存储的:

从图示中,我们可以看出序列中存储的是整数对象的地址,而不是整数对象的值。python中常用的序列结构有:字符串、列表、元组、字典、集合
2、列表
列表:用于存储任意数目、任意类型的数据集合。 列表是内置可变序列,是包含多个元素的有序连续的内存空间,Python 的列表大小可变,根据需要随时增加或缩小。列表定义的标准语法格式:a = [10,20,30,40]
其中,10,20,30,40 这些称为:列表 a 的元素。列表中的元素可以各不相同,可以是任意类型。比如:a = [10,20,'abc',True]
列表对象的常用方法汇总如下,方便大家学习和查阅【以下方法除了len()外,都无返回值,所有的操作都是直接针对目标列表内容,不会产生新的列表】。
方法 | 要点 | 描述 |
---|---|---|
list.append(x) | 增加元素 | 将元素 x 增加到列表 list 尾部 |
list.extend(aList) | 增加元素 | 将列表 alist 所有元素加到列表 list 尾部 |
list.insert(index,x) | 增加元素 | 在列表 list 指定位置 index 处插入元素 x |
list.remove(x) | 删除元素 | 在列表 list 中删除首次出现的指定元素 x |
list.pop([index]) | 删除元素 | 删除并返回列表 list 指定为止 index 处的元素,默认是最后一个元素 |
list.clear() | 删除所有元素 | 删除列表所有元素,并不是删除列表对象 |
list.index(x) | 访问元素 | 返回第一个 x 的索引位置,若不存在 x 元素抛出异常 |
list.count(x) | 计数 | 返回指定元素 x 在列表 list 中出现的次数 |
len(list) | 列表长度 | 返回列表中包含元素的个数 |
list.reverse() | 翻转列表 | 所有元素原地翻转 |
list.sort() | 排序 | 所有元素原地排序 |
list.copy() | 浅拷贝 | 返回列表对象的浅拷贝 |
2.1、列表的创建
2.1.1、基本语法创建
使用 []
语法创建列表,例如:1
2
3
4
5
6
7
810,20,'lanting','shuxu'] # 创建的元素可以不同(元素实际存储的是地址) a = [
# 创建一个空的列表对象 a = []
# 修改特定元素只需要覆盖指定索引的元素即可
10,20,'lanting','shuxu'] # 创建一个列表对象 a = [
0] = 100 # 修改第一个元素的值 a[
a
[100,20,'lanting','shuxu']
2.1.2、使用list()创建
使用 list()可以将任何可迭代的数据转化成列表。
1 | # 创建一个空的列表对象 [] a = list() |
【补充:range()创建整数列表】
range()可以帮助我们非常方便的创建整数列表,这在开发中及其有用。语法格式为:range([start,] end [,step])
start 参数:可选,表示起始数字。默认是 0
end 参数:必选,表示结尾数字。
step 参数:可选,表示步长,默认为 1
python3 中 range()返回的是一个 range 对象,而不是列表。我们需要通过 list()方法将其转换成列表对象。
典型示例如下:
1 | 3,15,2)) # 从3开始到15步长为2的迭代器 list(range( |
2.1.3、推导式生成
使用列表推导式可以非常方便的创建列表,在开发中经常使用。但是,由于涉及到 for 循环和 if 语句。
1 | 2 for x in range(5)] # 循环创建多个元素 a = [x* |
2.2、列表元素的增加和删除
当列表增加和删除元素时,列表会自动进行内存管理,大大减少了程序员的负担。但这个特点涉及列表元素的大量移动,效率较低。除非必要,我们一般只在列表的尾部添加元素或删除元素,这会大大提高列表的操作效率。
2.2.1、append()方法
原地修改列表对象,是真正的列表尾部添加新的元素,速度最快,推荐使用。1
2
3
420,40] a = [
80) # 尾部追加元素80 a.append(
a
[20, 40, 80]
2.2.2、“ + ”运算符操作或extend()函数
将原列表的元素和新列表的元素依次复制到新的列表对象中。其列表id不会变化1
2
3
4
5
6
720,40] a = [
80] # 使用 + 运算符从尾部追加一个列表 a = a + [
a
[20, 40, 80]
10]) # 使用extend()函数从尾部追加一个列表 a.extend([
a
[20, 40, 80, 10]
2.2.3、insert()插入元素
使用 insert()方法可以将指定的元素插入到列表对象的任意制定位置。这样会让插入位置后面所有的元素进行移动,会影响处理速度。涉及大量元素时,尽量避免使用。类似发生这种移动的函数还有:remove()、pop()、del(),它们在删除非尾部元素时也会发生操作位置后面元素的移动。1
2
3
410,20,30] a = [
2,100) 从索引为2的位置(第三个元素)插入元素100 a.insert(
a
[10, 20, 100, 30]
2.2.4、乘法扩展
使用乘法扩展列表,生成一个新列表,新列表元素时原列表元素的多次重复。1
2
3
4
5
6'sxt',100] a = [
3 b = a *
a
['sxt', 100]
b
['sxt', 100, 'sxt', 100, 'sxt', 100]
适用于乘法操作的,还有:字符串、元组。例如:1
2
3
4
5
6'sxt' c =
3 d = c *
c
'sxt'
d
'sxtsxtsxt'
2.2.5、使用 del 命令删除元素
使用del 删除列表指定位置的元素。如果不是删除最后一个元素,会导致列表的元素挪动。1
2
3
4100,200,888,300,400] a = [
del a[1] # 使用del命令删除
a
[100,200,300,400]
2.2.6、使用pop()方法删除元素
pop()删除并返回指定位置元素,如果未指定位置则默认操作列表最后一个元素。1
2
3
4
5
6
7
8
910,20,30,40,50] a = [
# 删除并返回最后一个元素 a.pop()
50
a
[10, 20, 30, 40]
1) # 删除并返回索引为1的元素 a.pop(
20
a
[10, 30, 40]
2.2.7、使用remove()方法删除元素
删除首次出现的指定元素,若不存在该元素抛出异常。【与pop()方法不同在于,remove()删除的是指定的元素,而pop()删除的是指定索引的元素】1
2
3
410,20,30,40,50,20,30,20,30] a = [
20) # 删除a列表中第一次出现的20 a.remove(
a
[10, 30, 40, 50, 20, 30, 20, 30]
2.3、列表元素访问和计数
2.3.1、通过索引直接访问元素
我们可以通过索引直接访问元素。索引的区间在[0, 列表长度-1]这个范围。超过这个范围则会抛出异常。1
2
310,20,30,40,50,20,30,20,30] a = [
2] # 直接通过索引号获取 a[
30
2.3.2、index()获得指定元素在列表中首次出现的索引
index()可以获取指定元素首次出现的索引位置。语法是:index(value,[start,[end]])。其中,start 和 end 指定了搜索的范围。1
2
3
4
5
6
710,20,30,40,50,20,30,20,30] a = [
20) # 查找20在列表中第一次出现的索引 a.index(
1
20,3) #从索引位置 3 开始往后搜索的第一个 20 a.index(
5
30,5,7) #从索引位置 5 到 7 这个区间,第一次出现 30 元素的位置 a.index(
6
2.3.3、count()获得指定元素在列表中出现的次数
count()可以返回指定元素在列表中出现的次数。因此可以使用count()函数来判断某个元素是否在列表中,count()统计结果为0表示不存在,否则为存在1
2
310,20,30,40,50,20,30,20,30] a = [
20) # 统计20在列表中出现的次数 a.count(
3
2.4、切片赋值
列表可以使用切片语法给列表批量赋值。1
2
3
4"lanting") name = list(
2:] = list("shuxu") # 将从第三个开始到最后的列表内容修改为新列表 name[
name
['l', 'a', 's', 'h', 'u', 'x', 'u']
切片赋值可以是与原列表不同长度的列表。1
2
3
4"he") name = list(
1:] = list("hello world") #将一个更长的元组赋值到列表中 name[
# 我们可以看到赋值后列表被扩宽了 name
['h', 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
切片还可以在不替换原有元素的情况下插入新元素1
2
3
41,5] number = [
1:1] = [2,3,4] # 在1后面的空切片中插入一个列表 number[
number
[1, 2, 3, 4, 5]
上面代码中,我们“替换”了一个空的切片,也就相当于插入了一个新元素,当然,也可以利用类似的措施来删除元素。1
2
3
4
5 number
[1, 2, 3, 4, 5]
1:4] = [] # 将某个切片范围设置为空列表,也就相当于删除了目标列表 number[
number
[1, 5]
上述代码与del nubmer[1:4]
等效
3、元组
与列表一样,元组也是序列,与元组的区别在于:元组是不能被修改的,元组的创建语法非常简单,只需要将一些值用逗号分隔,就自动创建一个元组。1
2
3
4
51,2,3 # 使用逗号分隔,自动创建一个元组。
(1, 2, 3)
1, 2, 3) # 当然也可以用()括起来,一般这是我们创建的方式 (
(1, 2, 3)
特别地,创建元素只有一个的元组时,需要做点特殊处理。1
2
3
4
5
642 # 当元组只有一个时,这样的创建方式会被识别为一个字面量
42
42, # 当只有一个元素时,我们需要额外在末尾增加一个逗号
(42,)
42,) # 括号中也是如此 (
(42,)
创建一个元素的时候不管是不是包含(),都应该在元素后面增加一个逗号。1
2
3
43 * (40 +2 ) # 如果没有逗号,就被识别为算数运算符
126
3 * (40+2,) # 使用逗号将不再把括号中的表达式认为成算数运算
(42, 42, 42)
函数tuple
函数tuple()的工作原理与list很像,它将一个序列作为参数,并将其转换为元组,如果参数已经是元组,就原封不动地返回它。1
2
3
4
5
61,2,3]) tuple([
(1, 2, 3)
"abc") tuple(
('a', 'b', 'c')
1,2,3)) tuple((
(1, 2, 3)
元组的切片操作,单个元素访问都与列表相同,只是元组不能修改内容而已。1
2
3
41,2,3 # 创建一个元组 x =
1] # 取得第2个元素 x[
2
0:2] # 切片操作 x[