day05 列表总结 和 random
列表部分,分为,1.列表的定义,2.列表的下标及切片的引入,3.列表的增删改查,4.好用的 BIF
1. 列表的定义
-
列表:一个能够储存各种数据的容器
-
属性:
a. 什么都能存储的大仓库
b. 可变的。 (增,删,改)
c. 有序的。 (下标,索引)
2.列表的下标及切片
下标 :
- 列表除了正向坐标,还可以使用负向坐标的(-1开始),并且可以组合使用
- 注意列表的下标是从0开始的即可
切片 :
-
定义 :从原来的容器中提取新的容器
-
语法 :变量[M : N : step] (注意是变量,不只是列表,其他变量也能用)
-
注意 :
a. 切片同样是一个左闭右开的区间,且如果是负向取数,也是左闭右开
b. 正向下标可以和负向下标组合使用,如list[0,-1],从开始取到倒数第二个
c. 步长step,即序号相减。且列表的长度永远是比最后一个索引值大1,也可以为负
3.列表的增删改查
增加元素 :
-
append() : 追加
list.append(需要插入的元素)*append()适用于所有向列表中追加元素的操作,列表推导式在某些情况下可以替代append,且性能方面列表推导式优于append*
-
insert() : 插入
list.insert(插入元素的位置,插入的元素) -
extend() :将另一个容器黏贴进列表
list.extend([1,2,3]) -
列表推导式
修改元素 :通过下标直接修改
列表的运算问题:
1.列表的重复: list1 * 10
2.列表的拼接: list1 + list2
3.成员运算: in、not in
4.比较大小:
# 第一对不相等的元素 ——> 比较 -> 类型一致,比较大小;类型不一致,报错
a. 比较的元素必须是同类型的,(如果第一对是不相等的,就会比较,燃后报错)
b. 比较大小的是第一对不相等的元素的大小(对容器来说的)
eg :list1 = 【1,2,3,4】
list2 = 【1,2,4,5】
list1小于list2,比较第一对不相等的3和4.
c. 数字正常比较大小
删除元素 :
-
clear : 直接将列表清空
list.clear() # clear()里不传参 -
del : 删除某个元素
del list[下标] -
remove() :移除某个元素 (彻底删除,无返回值)
list.remove(元素的值) -
pop() : 删除某个元素 (删除后,有返回值)
list.pop(索引) -
区分 :
1. 输入的什么:
a. pop()和del都是输入下标(索引)
b. remove()输入的是元素的值2. 返回值问题 : a. remove()无返回值 b. pop() 有返回值
查找元素 :
-
index() :从左向右查找,找到第一个符合元素立刻停止,返回下标
a. eg: 查找
index1 = num.index(‘a’)b. eg:查找第二个‘a’,从第5个开始查找
index1 = num.index(‘a’,5)c. 如果查找元素不存在,直接报错
4.列表推导式
-
作用:生成一个有元素的列表
-
语法:
( 只记这两句话)
(只注意:1.表达式会随着for循环遍历输出,后面展开按正常缩进展开就行了。2.其作用就是往列表里添加元素的)
1. **[表达式 for 变量 in 容器]**
a.展开是:for 变量 in 容器 :
表达式
b. for循环每执行一次,for循环就会将其生成的结果添加到列表中。**注意表达式是在for循环体里面的,参与循环的**
num = [i for i in range(1,101)]
num_2 = [1 for i in range(10)] # 向列表中添加10次1
2. **[表达式 for 变量 in 容器 if 条件]**
a. for循环执行一次,if分支判断一次,条件成立式表达式向列表中添加一次
list3 = [i for i in range(1,101) if i % 2 ==0]
3. **[表达式 for 变量 in 容器 for 变量 in 容器]**
list4 = 【i for _ in range(3) for _ in range(1,11)】
5. 列表内置的BIF
-
enumerate( ) 方法 :将列表转换成一个可迭代对象,输出列表的中所有的(下标,值)
-
len()方法:太熟了,不说了
-
max()与min() :但注意,只能比较同类型数据
-
count() : 统计某个元素出现的个数
print(num.count(4)) :统计4这个元素出现的次数
注意:count()的对象不能是列表,只有在excel这么用? -
sum(): 求和
-
reverse(): 将列表倒序,并且无返回值,直接修改
a. 作用等同于,num[::-1],但这个有返回值,得赋值
b. num.reverse() # 直接修改原列表num -
list.sort(reverse=False) 与 sorted(列表,reverse=False) :
a. sort :将列表从小到大排序,无返回值,直接修改原列表
使用方法:num=[1,2,3,4]
num.sort(reverse=True)
print(num)
b. sorted : 将列表从小到大排序,有返回值,不修改原列表
使用方法:num=[1,2,3,4]
sorted(num,reverse=True)
print(num) #原列表无修改d.一般无返回值修改原列表的: 都是“list.方法()”的格式,如list.append()
有返回值的: 都是函数形式,方法(list,参数=),如sorted(列表,reverse=True)
random模块
——> randint(1 , 4)——> 从【1,4】闭区间中随机获取一个整数
——> randrange(1, 4, 2)——> 约等于randint +range,左闭右开区间
——> random.choice([1,2,3,4]) ——> 从容器中随机获取一个元素
——> random.choices([1,2,3,4],k=2) ——> 从容器中随机获取k个元素,有放回的抽取元素
——> random.sample([1,2,3,4],k=3 ) ——> 无放回的抽取元素,且注意必须从有序容器抽取
——> random.shuffle(list1) ——> 将有序容器打乱顺序,并抽取,且无返回值,直接修改原容器
错题总结
一. 删除列表中的重复元素(不使用set())
使用不同的方法,BIF会让思路开阔,题目解法简化
方法一用的是not in ,方法二用的是count(),都没用到索引及列表长度
# 方法一,使用not in,将问题转化成: 将哪些元素加入新列表
# 这个可以成为固定用法,新的空列表+not in => 去重原列表进新列表
names = ['张三', '李四', '大黄', '张三','张三']
names_new = []
for i in names :
if i not in names_new :
names_new.append(i)
print(names_new)
# not in 的使用!!
# 方法二、使用count方法
# for循环为何能遍历循环? : for循环会首先给可迭代对象,附上初始迭代索引,然后0,1,2,3。执行完一个后,执行下一个。
#当你的循环中产生删除时,元素会移动,两个东西会变:角标和元素对应关系,列表长度len,这时候去用【】索引,很可能会out of range
# 方法二不牵扯索引及长度,直接count
names = ['张三', '李四', '大黄', '张三','张三']
for i in names :
if names.count(i) > 1 :
names.remove(i)
print(names)
# 方法三、最简单的方法set()
print(list(set(names)))