序列
序列是一种数据存储方式,用来存储一系列的数据。在内存中,序列是一块用来存放多个值的连续内存空间。空间内存放所指对象的id,如a = [10,20,30,40]
变量a指向序列块的id地址,序列块中每一个存放位指向对应元素的id地址。
定义一个序列,先在堆中新建序列元素对象,再建序列块,序列块大小可变,序列块中存储元素对象的id地址,变量a建在栈中存放序列块id地址。
python中常用的序列结构有:字符串、列表、元组、字典、集合。
列表
列表是内置可变序列,用于存储任意数目、任意类型的数据集合。列表中的元素可以各不相同,可以是任意类型。
a = [1,3,5,'a','b','c']
b = ['$','_',a] # ['$', '_', [1, 3, 5, 'a', 'b', 'c']]
列表的创建
- []创建
a = [1,3,5,'a','b','c']
b = [] # 可创建一个空列表对象
- list()创建
list()可以将任何可迭代的数据转化成列表,常与range()连用
range()不是列表,返回一个range对象,但可以方便的创建整数列表。
语法格式为:range([起始数字,] 结尾数字 [,步长])
起始数字默认为0,步长默认为1
a = list("study python") # ['s', 't', 'u', 'd', 'y', ' ', 'p', 'y', 't', 'h', 'o', 'n'],将字符串拆解成单个字符存放入列表
type(range(10)) # <class 'range'>
b = list(range(10)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],包前不包后
c = list(range(3,20,2)) # [3, 5, 7, 9, 11, 13, 15, 17, 19]
d = list(range(20,3,-2)) # [20, 18, 16, 14, 12, 10, 8, 6, 4],步长为负数时递减
e = list(range(3,-10,-1)) # [3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
f = list(range(-3,-10,-1)) # [-3, -4, -5, -6, -7, -8, -9],步长为负数,起始数字 > 结尾数字
- 推导式生成列表(涉及for 循环)
使用列表推导式可以非常方便的创建列表,内可包含for 循环和if语句。
a = [x*2 for x in range(5)] # [0, 2, 4, 6, 8]
b = [x*2 for x in range(100) if x%9==0] # [0, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198]
列表对象的常用函数
功能 | 函数 | 说明 |
---|---|---|
增加元素 | list.append(x) | 将元素x增加到列表list尾部 |
增加元素 | list.extend(List) | 将列表List所有元素加到列表list 尾部 |
增加元素 | list.insert(index,x) | 在列表list指定位置index 处插入元素x |
删除元素 | del list[index | 删除列表指定索引index处的元素 |
删除元素 | list.remove(x) | 在列表list中删除首次出现的指定元素x |
删除元素 | list.pop([index]) | 删除并返回列表list 指定index处的元素,默认是最后一个元素 |
删除所有元素 | list.clear() | 删除列表所有元素,但不删除列表对象 |
访问元素 | list[index] | 通过索引直接访问, 索引区间超出[0, 列表长度-1]的范围报错 |
访问元素 | list.index(x[,起始位置,终止为止]) | 返回第一个x 的索引位置,若不存在x 元素则报错 |
计数 | list.count(x) | 返回指定元素x 在列表list 中出现的次数 |
列表长度 | len(list) | 返回列表中包含元素的个数 |
排序 | list.sort() | 所有元素原地排序 |
排序 | sorted(list[,reverse=True]) | 返回新的排序列表,默认升序,不对原列表做修改 |
排序 | list(reversed(list)) | 返回一个逆序排列的迭代器对象,需转换为列表读取,且只能读取一次 |
- 列表元素的增加
- append()方法
原地修改列表对象,在列表尾部添加新元素,速度最快推荐使用。
a = [20,40]
id(a) # 76339272
a.append(80) # [20, 40, 80]
id(a) # 76339272
- +运算符操作
并不是真正的尾部添加元素,而是创建新的列表对象;将原列表的元素和新列表的元素依次复制到新的列表对象中。这样,会涉及大量的复制操作,不建议使用。
a = [20,40]
id(a) # 81442440
a = a + [60,80]
id(a) # 76967624
- extend()方法
将指定列表的所有元素添加到目标列表的尾部,属于原地操作,不创建新的列表对象。
"+"运算符操作不是真正的尾部添加元素,而是创建新的列表对象;将原列表的元素和新列表的元素依次复制到新的列表对象中。这会涉及大量的复制操作,不建议使用。
a = [20,40]
id(a) # 76337672
a.extend([50,60]) # [20, 40, 50, 60]
id(a) # 76337672
a = a+[50] # [20, 40, 50, 60, 50]
id(a) # 76374920
- insert()插入方法
list.insert(index,x)可以将元素插入到列表对象的任意指定位置,但这样会让插入位置后所有的元素进行移动,从而影响处理速度。涉及大量元素时,尽量避免使用。
类似这种移位操作remove()、pop()、del(),在删除非尾部元素时也会发生操作位后元素的移动,尽量避免使用。
a = [10,20,30]
id(a) # 76361224
a.insert(2,100) # [10, 20, 100, 30]
id(a) # 76361224
- 乘法扩展
使用乘法扩展列表时,生成一个新列表,且新列表元素是原列表元素的多次重复。
a = [1,2,3,'a','b','c']
id(a) # 81049224
a = a*3 # [1, 2, 3, 'a', 'b', 'c', 1, 2, 3, 'a', 'b', 'c', 1, 2, 3, 'a', 'b', 'c']
id(a) # 76339272
- 列表元素的删除
若从列表中间删除元素,删除位置后所有的元素进行前移,从而影响处理速度,尽量避免使用。
- del list[]删除
删除列表指定位置的元素,原地操作,不创建新的列表对象。
a = ['a','b','h','c','d','e']
del a[2] # ['a', 'b', 'c', 'd', 'e']
- remove()方法
删除首次出现的指定元素,若不存在该元素抛出异常。原地操作,不创建新的列表对象。
a = [1,2,3,1,2,3,1,2,3]
a.remove(2) # [1, 3, 1, 2, 3, 1, 2, 3]
- pop()方法
pop()删除并返回指定位置元素,如果未指定位置则默认操作列表最后一个元素。原地操作,不创建新的列表对象。
a = [10,20,30,40,50]
b = a.pop()
print(b) # 50
print(a) # [10, 20, 30, 40],依次向外取数
c = a.pop(1) # 未指定位置时默认弹出列表最后一个元素,可指定位置
print(c) # 20
print(a) # [10, 30, 40]
- list.clear()方法
删除列表内所有元素变为一个空列表,不删除列表对象