列表(list)
列表简介
- 列表是python中的一个对象
- 对象(object)就是内存中专门用来存储数据的一块区域
- 之前学的对象,如数值,它只能保存单一的数据
- 列表中可以保存多个有序的数据, 同一个列表里可以包含重复的数据
- 列表的使用
1、列表的创建
my_list = [] # 创建了一个空列表
my_list = [10] # 创建了一个只包含一个元素10的列表
my_list = [1, 2, 3] # 创建了一个包含多个元素的列表
my_list = [10, 'hello', True, None, [1,2,3], print] # 列表可以存储任意对象,包括函数、字符串等
(不过,列表一般存储的是相同类型的对象)
2、操作列表中的数据
- 列表中的对象是按插入的顺序存储到列表中
-通过索引(index)来获取列表中的元素,从0开始
例:
获取第一个元素 my_list[0]
获取第三个元素 my_list[2]
IndexError: list index out of range
- len()函数,获取列表的长度(为最大索引+1)
例:len(my_list)
切片(slice)
- 切片指从现有列表中,获取一个子列表
- 一般创建列表时,变量的名字会使用复数(???我不明白)
stus = ['孙悟空', '猪八戒', '沙和尚', '唐僧', '蜘蛛精', '白骨精']
- 列表的索引可以是负数,此时则从后向前获取元素,-1表示倒数第一个,以此类推
print(stus[-2]) ----> '蜘蛛精'
-通过切片来获取指定的元素
(1)语法: 列表[起始:结束]
- 通过切片获取元素时,会包括起始位置的元素,但是不包括结束位置的元素
例:stus[2:5] ----> ['沙和尚', '唐僧', '蜘蛛精']
- 起始和结束位置的索引均可以省略不写
- 省略结束位置,则会截取到最后
- 省略起始位置,则会从第一个元素截取
- 省略起始和结束位置,则相当于创建该列表的副本---> stus[:]
(2)语法: 列表[起始:结束:步长] (包括起始位置,不包括结束位置,步长不能为0)
- stus[::2] ----> ['孙悟空', '沙和尚', '蜘蛛精']
通用操作(序列通用操作,即只要是序列就可以使用这些操作)
1、操作符 + 和 *
+可以将两个列表拼接成一个列表
如 my_list = [1,2,3] + [4,5,6]
*可以将列表重复指定次数
如 my_list = [1,2,3] * 4
2、in 和 not in
in用来检查指定元素是否存在于列表中,返回True 或 False
如 '孙悟空' in stus -----> True
'牛魔王' in stus -----> False
not in 用来检查指定元素是否不在于列表中,返回True 或 False
(与in相反)
3、len() 获取列表中元素的个数
4、min()获取列表中的最小值
max()获取列表中的最大值
如min([1,2,3]) ----> 1
5、两个方法(method)
方法和函数基本上是一样的,只不过方法必须通过 对象.方法() 的形式来调用
如 xxx.index() 方法实际上就是和对象关系紧密的函数
(1)s.index(x) 获取指定元素x在列表s中第一次出现时的索引(注意是第一次出现)
如 stus.index('孙悟空') ---> 0
完整语法:
s.index(x[, i[, j]]) 参数:x, i, j
相当于 s[i:j].index(x) 查找元素x在位置i(包括)到位置j(不包括)之间的出现的索引
(2)s.count(x) 统计元素x在列表s中出现的次数
序列(sequence)
- 序列是Python中最基本的一种数据结构(数据结构指计算机存储数据的方式)
- 序列用于保存一组有序的数据,所有的数据在序列中都有唯一的位置(索引)
且序列中的数据会按照先后的顺序来分配索引(有序存储)
- 序列的分类
可变序列: 序列中的元素可以改变
> 列表(list)
不可变序列:序列中元素不可改变
> 字符串(str)
> 元素(tuple)
例子:stus = ['孙悟空', '猪八戒', '沙和尚', '唐僧', '蜘蛛精', '白骨精']
1、可变序列:
- 通过索引改变序列:
stus[0] = 'sunwukong'
---> ['sunwukong', '猪八戒', '沙和尚', '唐僧', '蜘蛛精', '白骨精']
- 通过del删除序列中的元素:
del stus[1] (删除'猪八戒')
---> ['孙悟空', '沙和尚', '唐僧', '蜘蛛精', '白骨精']
- 通过切片来修改序列:
(注:给切片进行赋值时,最好使用序列)
反例:stus[0:2] = 'swk' ('swk'相当于序列['s', 'w', 'k'])
---> ['s', 'w', 'k', '唐僧', '蜘蛛精', '白骨精']
所以规范的切片使用方式:
stus[0:2] = ['sunwukong', 'zhubajie']
---> ['sunwukong', 'zhubajie', '沙和尚', '唐僧', '蜘蛛精', '白骨精']
也可以插入利用切片修改元素的同时增加元素,如:
stus[0:2] = ['sunwukong', 'zhubajie', '二郎神']
---> ['sunwukong', 'zhubajie', '二郎神', '沙和尚', '唐僧', '蜘蛛精', '白骨精']
(上面这个例子指的是,用三个元素来有序替换序列的前两个元素)
在序列最前面添加元素:
stus[0:0] = ['牛魔王'] (向索引为0的位置插入元素)
---> ['牛魔王', '孙悟空', '猪八戒', '沙和尚', '唐僧', '蜘蛛精', '白骨精']
当设置步长时,序列中元素的个数必须和切片中元素的个数一致
通过切片来删除元素
del stus[0:2]
del stus[::2]
del stus[0:3] ---> 相当于 stus[0:3] = []
!!!(以上操作只对可变序列list生效,不可变序列无法通过索引来修改)
若要修改,则可通过list()函数将其他序列转化为list序列(此时序列类型则变为list可变序列)
列表的方法(以下方法只能对可变序列起作用)
例子:stus = ['孙悟空', '猪八戒', '沙和尚']
1、s.append(x) ---> 向列表s的最后添加一个元x素, 相当于s[len(s):len(s)] = [x]
stus.append('唐僧') ---> ['孙悟空', '猪八戒', '沙和尚', '唐僧']
(在列表最前面添加一个元素:stus[0:0] = ['唐僧'])
2、s.extend(t) or s += t ---> 将序列t添加到指定序列s中,相当于s[len(s):len(s)] = t
(与append区别:extend可以同时添加多个元素)
例: stus.extend(['mai','liang','shi'])
---> ['孙悟空', '猪八戒', '沙和尚','mai','liang','shi']
3、s.insert(i, x) ---> 在序列s的索引i位置插入元素x,相当于s[i:i] = [x]
即在原先的第i-1和第i位之间插入一个元素,作为改变后的第i位
例: stus.insert(1, '唐僧') ---> ['孙悟空', '唐僧', '猪八戒', '沙和尚']
4、s.clear() ---> 清空序列
例: stus.clear() ---> []
5、s.pop(i) ---> 根据索引删除索引为i的元素且返回该元素
stus.pop(i) ---> '猪八戒' (返回被删除的元素)
缺省为最后一个元素,如 stus.pop() ---> '沙和尚' (返回被删除的元素)
6、s.remove(x) ---> 删除指定值的元x素(有多个相同值的元素,则只会删除第一个元素)
7、s.reverse() ---> 将序列中的元素颠倒顺序
注意,该函数无返回值,因此:
result = stus.reverse()
print(result) ---> None
8、s.sort() ---> 用于对列表的元素进行排序,默认是升序排列
降序排列: s.sort(reverse=True) 加入参数reverse=True 表示降序排列
遍历列表
例子:stus = ['孙悟空', '猪八戒', '沙和尚', '唐僧']
法一:(此方法常用)
for s in stus:
print(s)
(注:每执行一次就会将序列中的一个元素赋值给变量s)
法二:(稍麻烦)
for i in range(len(stus)):
print(stus[i])
法三:(一般不用此方法)
i = 0
while i < len(stus):
print(stus[i])
i += 1
以上方法也适用于一维的numpy数据,但是对于多维numpy数据,则需要使用函数:
np.nditer(numpy_ndarray)
enumerate()
迭代时获取索引:
lst = ['a', 'b', 'c']
for index, string in enumerate(lst):
print(index, string)
---> 0 'a'
1 'b'
2 'c'
range()函数
range()是一个用来生成一个自然数序列的函数
r = range(5) ---> 生成这样的序列[0,1,2,3,4]
r = range(1, 9, 2) ---> 起始1(包括1), 结束9(不包括9), 步长2
该函数需要三个参数:
1、起始位置(可以省略,默认是0,包括起始位置)
2、结束位置(不可省略,不包括结束位置)
3、步长(可以省略,默认是1)