列表
一.什么是列表 ?
-
列表的定义:列表是容器型数据类型,将[ ]作为容器的标志,里面多个元素用逗号隔开
-
列表的特性:
- 什么都能存的大仓库:什么数据类型都可以放进去
- 可变的:列表中元素的个数和值是可以改变的,支持增删改
- 有序性:每个元素有其位置信息,支持下标索引操作
list = [ ]
print(list[0])
# 注意,只打一个空格,其不属于任何数据类型,只是一个格式缩进,和空列表是一样的
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
Input In [2], in <cell line: 2>()
1 list = [ ]
----> 2 print(list[0])
IndexError: list index out of range
# 关于 Nan和 None的区别:
# Nan多为计算无结果,返回到数表里的值
# None为python中表示空的符号
二.列表的增删改查
1. 增加元素
-
list.append(元素) :将该元素添加到列表最后
-
list.insert(插入元素的位置,要插入的元素): 将该元素放到指定位置,然后将该位置原来的元素及其后面的元素往后排(易错)
-
list.extend(list) : 将另一个列表黏贴到原列表后面
-
利用数学运算符+、或 * :
- list = list1+list2
- list*N–>列表中的元素重复N遍,然后产生一个新的列表
2.删除元素
-
del list(下标): 删除该元素
-
list.remove(元素的值) :删除第一个等于该元素值的元素,注意是第一个
-
list.pop(下标) :取出该元素,注意pop有返回值,上面两种都没有返回值
-
list.clear() :清空列表
特殊情况处理:遍历列表+删除 的跳过情况
-
概述:当遍历时,你删除或者插入元素,遍历对象list改变,而for循环还是按照之前的下标依次增加。是以,存在这两方面问题。
-
处理方法(例子见错题一):
- 备份一个相同的列表,遍历新列表,list.remove()原列表
- 建立一个新列表,把符合条件的加入新列表;有时会和in联用 —>这个是最好用的,不删除而添加
- 反着删除
3.修改元素
list[下标] = 值
4.查找元素
-
获取单个元素:列表[下标]
- 下标怎么用?:
- 列表中每个元素有两种下标索引方式共存:正向索引和负向索引
- 正向索引从0开始,负向索引从-1(最后一个元素)开始
- 下标怎么用?:
-
获取多个元素:切片:列表[开始下标:结束下标:步长]
- 开始下标和结束下标
- 方向:开始下标和结束下标会构成一个方向。
- 下标正负:开始下标和结束下标可以是正数(正向索引),也可以为负数(负向索引),也可以混合使用(同样会构成一个方向)
- 重点:下标从0开始,且,最后一个值不取(特指结束下标所指的那一个元素取不到)
- 步长
- 正负:表方向,正数,代表从前往后,负数,代表从后往前。下标构成的方向与步长方向需要保持一致,否则就会返回空列表。
- 大小:步长为1时,正常挨个取,步长为2时,是跳一个取一个,往后数到的第二个元素
- 特殊的切片快捷操作:
- 省略:
- 省略步长,默认步长是1;
- 省略开始/结束下标,全取;
- 三个位置都可省,或两两省略,或全省
- list[::]:列表拷贝赋值
- list[::-1]:翻转列表
- 省略:
- 开始下标和结束下标
-
使用遍历获取元素
- 列表遍历取数有三种方法:
- 直接遍历
- 间接遍历
- for 变量1,变量2 in enumerate(list):
循环体
#依次输出所有元素的下标和索引
- 列表遍历取数有三种方法:
heroes = ['王昭君', '孙斌', '李白', '百里守约', '墨子', '澜', '孙悟空', '诸葛亮', '李信', '妲己']
print(heroes[-1:1:2])
#[]
print(heroes[2:7:-2])
#[]
print(heroes[8:1:3])
#[]
print(heroes[6:0:-2])
#['孙悟空','墨子','李白']
print(heroes[-1:1:-1])
#['妲己','李信','诸葛亮','孙悟空','澜','墨子','百里守约','李白']
print(heroes[0:7:3])
#['王昭君','百里守约','孙悟空']
[]
[]
[]
['孙悟空', '墨子', '李白']
['妲己', '李信', '诸葛亮', '孙悟空', '澜', '墨子', '百里守约', '李白']
['王昭君', '百里守约', '孙悟空']
5. 使用运算符对列表进行操作
-
+、*:
- list = list1+list2 、和字符串一样,也可以直接粘贴
- list * N :将列表内元素重复N遍,然后形成一个新的列表
-
in:成员运算符
3.>和 <:列表比较大小
+ 比较第一对不相等的元素大小(其他有序容器都是这么比的)
三、列表的BIF
-------------通用函数,有序列的都可以用,如range,字符串--------------------
1. sum(列表):要求列表中的元素必须都是数字
2. max(列表)、min(列表):获取列表中的最大值,要求列表中的元素支持比较运算
3.sorted(列表):对原列表无修改,生成一个新的从小到大排序好的列表,有返回值。
- reverse:sorted(列表,reverse=True) 翻转,将列表从大到小排列
4.len(列表):返回列表的长度,元素的个数
5.list(列表):对象只能是可迭代对象。将指定序列一个个转化为列表,将序列中的元素转化为列表中的元素
-------------列表的方法:方法是面向对象的概念,这里的方法只能对列表用-----------------
1. list.clear():清空列表
2. list.copy():浅拷贝原列表,返回一个新列表。
+ copy是浅拷贝,也会新开一个数据源,只不过不复制子列表的数值
+ 相同功能的用法:list[:]、list*1、list+[]
3. list.count(元素):返回指定元素出现的次数
4.list.index(元素):返回第一个指定元素的下标,注意是第一个;如果数据不存在会报错
5. list.reverse( ): 列表倒序翻转
6. list.sort(reverse=False/True):将原列表,默认从小到大排序,没有返回值
四、列表推导式
-
[表达式 for 变量 in 容器]
-
[表达式 for 变量 in 容器 if 条件]
五、 列表的拷贝(课外拓展)
-
python中变量拷贝和可变容器(如列表)拷贝不同
- 变量拷贝,直接:b = a
- 列表拷贝,list1 = list1[:]、list*1,list+[ ]
- 正常变量赋值不用考虑,但列表拷贝必须使用浅拷贝
- 原理:正常拷贝赋值都是赋值的地址,变量拷贝,你要是修改,就会产生新的空间储存数据,和原来无牵扯。 而列表拷贝不能使用正常的赋值操作来赋值,因为里面容器可变,修改会直接修改原数据源。
-
深拷贝和浅拷贝有哪些不同
- 两者相同点:
- 都会复制一份一个新的数据源
- 不同点:
- 列表中如果有子列表,两者的复制出来的的数据不一样
- 解释:浅拷贝,对于子列表的位置,会只拷贝地址,指向原来的子列表。深拷贝,对于列表中的子列表,会直接再复制一份数据。
- 两者相同点:
-
拓展:
-
内存有两种(不止这两块):栈区间和堆区间
- 栈区间:所有变量名(即数据所在的地址,指针)都在栈区间
- 堆区间:所有数据都在堆区间
-
拷贝方式有两种:深拷贝和浅拷贝
- 浅拷贝:在栈里,给变量名copy一份地址,指向原来的数据存储地方。
- 深拷贝:在堆里,建立一个新的数据空间,和之前的数据大小一样,然后再搞一个新的变量名指向它。 list[:],list*1,list+[]
-