# 列表&序列
# 列表(list)
- 列表是Python中的一个对象
- 对象(object)就是内存中专门用来存储数据的一块区域
- 之前我们学习的对象,像数值,它只能保存一个单一的数据
- 列表中可以保存多个有序的数据
- 列表是用来存储对象的对象
- 列表的使用:
- 列表的创建
- 操作列表中的数据
# 序列(sequence)
- 序列是Python中最基本的一种数据结构
- 数据结构指计算机中数据存储的方式
- 序列用于保存一组有序的数据,所有的数据在序列当中都有一个唯一的位置(索引),并且序列中的数据会按照添加的顺序来分配索引
- 序列的分类:
- 可变序列(序列中的元素可以改变):
- 列表(list)
- 不可变序列(序列中的元素不能改变):
- 字符串(str)
- 元组(tuple)
- 可变序列(序列中的元素可以改变):
## 创建列表,通过[]来创建列表
my_list = [] # 创建了一个空列表
print(my_list , type(my_list))
## 列表存储的数据,我们称为元素
## 一个列表中可以存储多个元素,也可以在创建列表时,来指定列表中的元素
my_list = [10] # 创建一个只包含一个元素的列表
## 当向列表中添加多个元素时,多个元素之间使用,隔开
my_list = [10,20,30,40,50] # 创建了一个保护有5个元素的列表
## 列表中可以保存任意的对象
my_list = [10,'hello',True,None,[1,2,3],print]
## 列表中的对象都会按照插入的顺序存储到列表中,
## 第一个插入的对象保存到第一个位置,第二个保存到第二个位置
## 我们可以通过索引(index)来获取列表中的元素
## 索引是元素在列表中的位置,列表中的每一个元素都有一个索引
## 索引是从0开始的整数,列表第一个位置索引为0,第二个位置索引为1,第三个位置索引为2,以此类推
my_list = [10,20,30,40,50]
## 通过索引获取列表中的元素
## 语法:my_list[索引] my_list[0]
print(my_list[4])
## 如果使用的索引超过了最大的范围,会抛出异常
print(my_list[5]) # IndexError: list index out of range
## 获取列表的长度,列表中元素的个数
## len()函数,通过该函数可以获取列表的长度
## 获取到的长度的值,是列表的最大索引 + 1
print(len(my_list)) # 5
## 切片
## 切片指从现有列表中,获取一个子列表
## 创建一个列表,一般创建列表时,变量的名字会使用复数
stus = ['孙悟空','猪八戒','沙和尚','唐僧','蜘蛛精','白骨精']
## 列表的索引可以是负数
## 如果索引是负数,则从后向前获取元素,-1表示倒数第一个,-2表示倒数第二个 以此类推
print(stus[-2])
## 通过切片来获取指定的元素
## 语法:列表[起始:结束]
## 通过切片获取元素时,会包括起始位置的元素,不会包括结束位置的元素
## 做切片操作时,总会返回一个新的列表,不会影响原来的列表
## 起始和结束位置的索引都可以省略不写
## 如果省略结束位置,则会一直截取到最后
## 如果省略起始位置,则会从第一个元素开始截取
## 如果起始位置和结束位置全部省略,则相当于创建了一个列表的副本
print(stus[1:])
print(stus[:3])
print(stus[:])
print(stus)
## 语法:列表[起始:结束:步长]
## 步长表示,每次获取元素的间隔,默认值是1
print(stus[0:5:3])
## 步长不能是0,但是可以是负数
print(stus[::0]) # ValueError: slice step cannot be zero
## 如果是负数,则会从列表的后部向前边取元素
print(stus[::-1])
## + 和 *
## +可以将两个列表拼接为一个列表
my_list = [1,2,3] + [4,5,6]
## * 可以将列表重复指定的次数
my_list = [1,2,3] * 5
## print(my_list)
## 创建一个列表
stus = ['孙悟空','猪八戒','沙和尚','唐僧','蜘蛛精','白骨精','沙和尚','沙和尚']
## in 和 not in
## in用来检查指定元素是否存在于列表中
## 如果存在,返回True,否则返回False
## not in用来检查指定元素是否不在列表中
## 如果不在,返回True,否则返回False
print('牛魔王' not in stus)
print('牛魔王' in stus)
## len()获取列表中的元素的个数
## min() 获取列表中的最小值
## max() 获取列表中的最大值
arr = [10,1,2,5,100,77]
print(min(arr) , max(arr))
## 两个方法(method),方法和函数基本上是一样,只不过方法必须通过 对象.方法() 的形式调用
## xxx.print() 方法实际上就是和对象关系紧密的函数
## s.index() 获取指定元素在列表中的第一次出现时索引
print(stus.index('沙和尚'))
## index()的第二个参数,表示查找的起始位置 , 第三个参数,表示查找的结束位置
print(stus.index('沙和尚',3,7))
## 如果要获取列表中没有的元素,会抛出异常
print(stus.index('牛魔王')) # ValueError: '牛魔王' is not in list
## s.count() 统计指定元素在列表中出现的次数
print(stus.count('牛魔王'))
## 创建一个列表
stus = ['孙悟空','猪八戒','沙和尚','唐僧','蜘蛛精','白骨精']
print("修改前:",stus)
## 修改列表中的元素
## 直接通过索引来修改元素
stus[0] = 'sunwukong'
stus[2] = '哈哈'
## 通过del来删除元素
del stus[2] # 删除索引为2的元素
print('修改后:',stus)
stus = ['孙悟空','猪八戒','沙和尚','唐僧','蜘蛛精','白骨精']
print("修改前:",stus)
## 通过切片来修改列表
## 在给切片进行赋值时,只能使用序列
stus[0:2] = ['牛魔王','红孩儿'] 使用新的元素替换旧元素
stus[0:2] = ['牛魔王','红孩儿','二郎神']
stus[0:0] = ['牛魔王'] # 向索引为0的位置插入元素
## 当设置了步长时,序列中元素的个数必须和切片中元素的个数一致
stus[::2] = ['牛魔王','红孩儿','二郎神']
## 通过切片来删除元素
del stus[0:2]
del stus[::2]
stus[1:3] = []
print('修改后:',stus)
## 以上操作,只适用于可变序列
s = 'hello'
## s[1] = 'a' 不可变序列,无法通过索引来修改
## 可以通过 list() 函数将其他的序列转换为list
s = list(s)
print(s)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# 列表的方法
## 列表的方法
stus = ['孙悟空','猪八戒','沙和尚','唐僧']
print('原列表:',stus)
## append()
## 向列表的最后添加一个元素
stus.append('唐僧')
## insert()
## 向列表的指定位置插入一个元素
## 参数:
## 1.要插入的位置
## 2.要插入的元素
stus.insert(2,'唐僧')
## extend()
## 使用新的序列来扩展当前序列
## 需要一个序列作为参数,它会将该序列中的元素添加到当前列表中
stus.extend(['唐僧','白骨精'])
stus += ['唐僧','白骨精']
## clear()
## 清空序列
stus.clear()
## pop()
## 根据索引删除并返回被删除的元素
result = stus.pop(2) # 删除索引为2的元素
result = stus.pop() # 删除最后一个
print('result =',result)
## remove()
## 删除指定值得元素,如果相同值得元素有多个,只会删除第一个
stus.remove('猪八戒')
## reverse()
## 用来反转列表
stus.reverse()
## sort()
## 用来对列表中的元素进行排序,默认是升序排列
## 如果需要降序排列,则需要传递一个reverse=True作为参数
my_list = list('asnbdnbasdabd')
my_list = [10,1,20,3,4,5,0,-2]
print('修改前',my_list)
my_list.sort(reverse=True)
print('修改后',my_list)
print('修改后:',stus)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 遍历列表
## 遍历列表,指的就是将列表中的所有元素取出来
## 创建列表
stus = ['孙悟空','猪八戒','沙和尚','唐僧','白骨精','蜘蛛精']
## 遍历列表
print(stus[0])
print(stus[1])
print(stus[2])
print(stus[3])
## 通过while循环来遍历列表
i = 0
while i < len(stus):
print(stus[i])
i += 1
## 通过for循环来遍历列表
## 语法:
## for 变量 in 序列 :
## 代码块
## for循环的代码块会执行多次,序列中有几个元素就会执行几次
## 没执行一次就会将序列中的一个元素赋值给变量,
## 所以我们可以通过变量,来获取列表中的元素
for s in stus :
print(s)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26