十一、容器——列表
1. 概念
- 列表
-
List
(列表) 是Python
中使用 最频繁 的数据类型,在其他语言中通常叫做 数组 -
列表:用于存储任意数目、任意类型的数据集合。
由于 Python3 中一切皆对象,在内存中实际是按照如下方式存储的: a = [10,20,30,40]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8HK6RUVr-1610113536687)(Media/image-20201230183230732.png)]
- 特点
- 与其他语言不同,Python的列表是大小可变的
- 定义格式
- 变量名 = [值1, 值2, …]
cl = [] # 空列表
cl = [1,2,3]
cl = [i for i in range(10)]
cl = [i*2 for i in range(10)] # [2, 4, 6...]
- 变量名 = list(值)
- 可以将任何可迭代对象转换成列表
cl1 = list() # 空列表
cl2 = list(listA) #类型转换
cl3 = list(range(10))
cl4 = list('hello') # ['h', 'e', 'l', 'l', 'o'] 将字符串自动拆分
list()可以接收元组、字符串、其他序列类型、迭代器等生成列表。
- 应用场景
- 尽管
Python
的 列表 中可以 存储不同类型的数据 - 但是在开发中,更多的应用场景是
- 列表 存储相同类型的数据
- 通过 迭代遍历,在循环体内部,针对列表中的每一项元素,执行相同的操作
2. 下标访问
同字符串
注意:从列表中取值时,如果 超出索引范围,程序会报错
3. 遍历
同字符串或元组
4. 嵌套列表定义和遍历
cl3=[1,2,3,(4,5,6),'hello',['a','b','c']]
print(cl3)
for v in cl3:
if isinstance(v,tuple) or isinstance(v,list):
for i in v:
print(i)
else:
print(v)
5. 排序和逆序
-
sort()
:默认升序,按字母表顺序,改变原来列表 -
sort(reverse=True)
:降序排序,改变原来列表 -
reverse()
:逆序,改变原来列表 -
sorted()
:排序,返回新的列表【了解】 -
reversed()
:逆序,返回新的列表
实现
# 实现列表的逆序(有返回值)
cl = list('hello')
print(cl)
def rev_list(cl):
i = len(cl)-1
rel=[]
while i>=0:
rel.append(cl[i])
i-=1
return rel
print(rev_list(cl))
# 实现列表的逆序(无返回值,同reverse())
def reverse_list(cl):
length = len(cl)
index_start = length // 2-1
for i in range(0,index_start+1):
temp = cl[i]
cl[i]=cl[length -1-i]
cl[length -1-i]=temp
cl = list('01234')
print(cl)
reverse_list(cl)
print(cl)
6. 常用方法
增:
append()
extend()
insert()
关键字 / 函数 / 方法 | 说明 |
---|---|
append(数据) | 在末尾追加数据【如果传入的是一个列表,则整个列表会被当作一个元素(二维列表)】 |
列表1.extend(列表2) | 将列表2 的数据追加到列表1 |
insert(索引, 数据) | 在指定位置插入数据,改位置及之后元素整体后移 插入时,没有下表越界问题,当制定下标超过范围,相当于追加在最后位置 |
- 效率问题
- append()方法:原地修改列表对象,是真正的列表尾部添加新的元素
- 速度最快,推荐使用。
+
运算符操作 :并不是真正的尾部添加元素,而是创建新的列表对象- 将原列表的元素和新列表的元素依次 复制到新的列表对象中。这样,会涉及大量的复制操作,对于操作大量元素不建议使用。
- extend()方法:将目标列表的所有元素添加到本列表的尾部,
- 属于原地操作,不创建新的列表对象。
- insert()插入元素 使用 insert()方法可以将指定的元素插入到列表对象的任意制定位置。
- 这样会让插入位置后 面所有的元素进行移动,会影响处理速度。
- 涉及大量元素时,尽量避免使用。
- 类似发生这种 移动的函数还有:remove()、pop()、del()
- 乘法扩展:使用乘法扩展列表,生成一个新列表,新列表元素时原列表元素的多次重复。
删:
关键字 / 函数 / 方法 | 说明 |
---|---|
pop() | 默认删除末尾数据 |
pop(索引) | 删除指定索引数据 并返回该元素 |
remove(数据) | 删除第一个出现的指定数据,有多个相同对象,只删除第一个 若不存在该元素抛出异常。 |
clear | 清空列表,但列表存在 |
del listA[i] | 删除指定索引的数据【关键字】 |
del listA | 删除整个列表【关键字】 |
del(listA[i]) | 删除指定索引的数据【函数】 |
del(listA) | 删除整个列表【函数】 |
注:【重要】
- 不要在循环遍历时删除元素
- 删除元素的本质
删除列表指定位置的元素。
a = [100,200,888,300,400]
del a[1]
a # [100,200,300,400]
本质是依次将后一个元素拷贝至前一个,打到删除的效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V2jfu9bB-1610113536692)(Media/image-20201230191356775.png)]
- 插入元素的本质
依次将改位置元素后移,并在之后赋值该位置元素新的值
改:
下标修改
cl = [1,2,3]
cl[2] = 11 # [1,11,3]
查:
index()
count()
in
:(掌握)
not in
关键字 / 函数 / 方法 | 说明 |
---|---|
len(列表) | 列表长度【函数**】 |
列表.index(数据) | 数据在列表中的位置(索引) |
列表.count(数据) | 数据在列表中出现的次数 |
元素 in listA | 某元素是否在列表中【常用】【关键字】 |
元素 not in listA | 某元素是否不在列表中【关键字】 |
7. 列表的应用:
- 拆分字符串
s = 'hello'
cl = list(s) # ['h', 'e', 'l', 'l', 'o']
- 复制列表所有元素到新列表对象
list1 = [30,40,50]
list2 = list1
8. 列表推导式——(创建列表)
- 列表推导式
通过表达式和循环,批量创建列表元素
格式
列表变量 = [表达式 for 变量 in range(10)]
# 表达式中包含后面的变量
列表变量 = [表达式 for item in 可迭代对象 if 条件判断]
注意
- 表达式中必须包含后面的变量
- 列表推导式生成元素全部在内存中,比较占资源
- 列表生成式则是用一个生成一个,节省资源
eg.
# 创建有100个数字的推导式
# 方式一
cl=[]
for i in range(100):
cl.append(i)
print(cl)
# 方式二,列表推导式
cl = [i for i in range(100)]
print(cl)
cl = [i*2 for i in range(100)]
print(cl) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20,...
- 在循环过程中使用if
格式
列表变量 = [表达式 for 变量 in range(10) if 判断条件]
# 表达式中包含后面的变量
eg.
# 筛选3的倍数
cl=[i for i in range(1,101) if i % 3 == 0]
print(cl)
- 两个for循环
内核:for循环嵌套
注意:
- 外层执行一次,内层循环一圈
eg.
# 创建一个列表,列表中的每个元素都具有两个值
cl = [(x, y) for x in range(10) for y in range(3)]
print(cl)
*9. 多维列表
- 二维列表
- 一维列表可以帮助我们存储一维、线性的数据。
- 二维列表可以帮助我们存储二维、表格的数据。例如下表的数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X0e5r3EB-1610113536695)(Media/image-20201230194947796.png)]
a = [
["高小一",18,30000,"北京"], ["高小二",19,20000,"上海"], ["高小一",20,10000,"深圳"],
]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BeRTaQs6-1610113536699)(Media/image-20201230194919289.png)]
- 遍历输出二维列表
a = [
["高小一",18,30000,"北京"], ["高小二",19,20000,"上海"], ["高小一",20,10000,"深圳"], ]
for m in range(3):
for n in range(4):
print(a[m][n],end="\t")
print() #打印完一行,换行