1. 线性结构
- 可迭代,比如支持遍历语句 for i in 可迭代对象。
- 可以用len()函数获取长度。
- 可以使用索引访问,
obj[index] => 当前索引的值
,索引也叫下标,从左到右由0开始,从右到左由-1开始,正负索引不可超界,否则会出错IndexError。 -
2. 列表
一种容器类数据结构,可以存储所有合法类型数据,可变数据类型,元素可以自由增删改
2.1 定义
l1 = [] # 使用list()创建空列表时会有函数调用,创建栈,[]是一个内置得c函数,可直接调用
l2 = [1, 2.0, 'abc', None, True, [1, 2, ""]] # 合法类型都可以
l3 = list(可迭代对象) # 参数可以不传,即空列表
2.2 增
ls.append(obj) => None
尾部追加元素,就地修改,O(1)ls.extend(iterable) => None
追加可迭代对象的元素,就地修改,O(1)ls.insert(index, obj) => None
指定索引处插入值,就地修改,会有元素移动效率很差,O(n),可超界,最右相当于尾部追加,最左相当于头部追加2.3 删
ls.remove(value) => None
按值删除,会遍历列表进行移除,就地修改,效率低O(n)ls.pop(index) => 移除的值
按索引移除,会引起列表内元素的移动,不推荐;不指定索引,会从尾部弹出元素,从尾部弹出O(1),使用比较多,会有超界错误IndexErrorls.clear() => None
清空列表内所有元素(将元素的引用计数减一),剩下一个空列表,不存在效率问题,除非真的没用了,否则最好不用2.4 改
ls[index] = value
就地修改且元素不挪动,会超界错误IndexError2.5 查
ls[index] => value
直接获取,O(1)ls.index(value, [start, [stop]]) => index
根据值获取其索引,匹配不到则ValueError,从左向右遍历列表,O(n),能少用则少用ls.count(value) => value的总数
返回value的总数,如果值不存在,会返回0,遍历列表,O(n),能少则少len(ls) => 列表的长度
列表是封装类型,拥有长度属性,O(1)2.6 其他操作
ls.reverse() => None
列表反转,就地修改,少用,效率极低,不如倒着读数据ls.sort(key=None, reverse=False) => None
就地修改,按key指定类型进行排序,默认升序,元素本身不变,key可以指定函数,将列表内元素按照key的函数进行转换,比如key=int,即将列表内的元素通过int进行转换(会报错)obj in ls => True/False
判断obj对象是否在列表l里,一般用于判断语句里id(ls)
返回ls的内存地址,只要是python对象,均可用[] + [] => 新的列表
原列表不改变,吃内存,空间复杂度大,耗时,不推荐[] * 数字
列表复制,比如[1] * 5 => [1, 1, 1, 1, 1];多维矩阵最好别用此复制,存在浅拷贝3. 拷贝
3.1 影子(浅)拷贝
对可变数据类型拷贝的是其在内存中的引用地址,如果对拷贝对象的值进行修改,则会影响原来的对象的值 ```python l0 = [1, [2, 3], 4]等号,星号也是浅拷贝
l1 = l0.copy() print(l0 == l1) # 内容对比 True print(l0 is l1) # 内存地址对比 True
l1[1][0] = 1 # [1, [1, 3], 4] print(l0) # [1, [1, 3], 4]
l0[1][1] = 100 # [1, [1, 100], 4] print(l1) # [1, [1, 100], 4]
<a name="ST8Aa"></a>
## 3.2 深拷贝
将可变数据类型的值另开辟一块内存进行存储,此时l0 与 l1互不干扰
```python
import copy
l0 = [1, [2, 3], 4]
l1 = copy.deepcopy(l0)
print(l0 == l1) # True
print(l0 is l1) # False
l1[1][0] = 1 # [1, [1, 3], 4]
print(l0) # [1, [2, 3], 4]
l0[1][1] = 100 # [1, [1, 100], 4]
print(l1) # [1, [1, 3], 4]
4. random模块
import random
# 常用
random.randint(a, b) => [a, b]之间的整数,与randrange()类似
random.randrange([start,] stop [,step]) => [start, stop)中的一个整数,step为步长
random.choices(seq) => 非空序列元素中的一个元素
random.shuffle(list) => None 就地打乱,效率可能会低
random.sample(list, k) => 新list 取样,取list中k个不同索引的元素,k不填,默认两次元素
5. 元组
5.1 定义
t1 = ()
t2 = tuple(可迭代对象) # 参数可为空,即定义一个空元组
t3 = (1,) # 定义一个元素的元组时,别忘加逗号
t4 = (1, [2, 3], 'a', None,...)
不可变数据类型,一旦创建,元组本身不可更改,但元素是可变对象时,可变对象是可以更改的,其类似于只读列表,增删改都没有
5.2 查
支持索引,不可超界t[index] => 索引对应的值
t.index(value, [start, [stop]]) => 元组内值对应的索引
t.count(value) => 元组内值的总数
len(t) => 元组长度
5.3 namedtuple
from collections import namedtuple
# 一旦创建不可更改的对象
# 参数中的User用来看的,第二个参数可以是"name age","name,age"
User = namedtuple('User', ['name', 'age'])
print(User.__base__) => <class 'tuple'>
user = User("xiao_ming", 0)
print(user) => User(name='xiao_ming', age=0)
print(user.g) => AttributeError: 'User' object has no attribute 'g'
user.age = 10 => AttributeError: can't set attribute
print(getattr(user, "name")) => 'xiao_ming'