三 列表
3.1 列表
列表,是能够存储各种数据的容器,列表是可变的,列表是有序的(下标),列表的容器符号[],list
3.1.1 创建一个空列表
list1 = []
3.1.2 增、删、改
(1)增加元素:
append():追加
insert():插入
list1.append('Python')
list1.append('Java')
list1.insert(1, 'HTML')
list1.insert(1, 0)
print(list1)
下标:python中下标
正向下标,从0开始
负向下标:从-1开始
(2)修改:通过下标改元素
语法:列表[下标] = 新的值
list1[1] = 'C'
print(list1)
(3)删除元素
del:语法:del 列表[下标]
remove:移除某个元素(彻底删除)
pop:移除某个元素(删除文件后知道删除的是谁)
clear:将列表清空
del list1[1]
print(list1)
print(list1.remove('Java'))
print(list1)
print(list1.pop(0))
print(list1)
list1.clear()
print(list1)
(4)查
index():从左向右查找元素,找到这个元素第一次出现的位置就停止查找返回下标,找不到报错。
a.默认从开头开始找
b.可以指定开始查找的位置
index1 = movie_list.index('长津湖')
print(index1)
index2 = movie_list.index('长津湖', 3)
print(index2)
3.1.3 转换
万国码(unicode)
中文字符的范围:\u4e00-\u9fa5
ord():将进制转换为十进制
print(ord('\u4e00'),ord('\u9fa5'))
chr()——能够将进制转换为其对应的符号
for i in range(19968, 40870):
print(chr(i),end='')
3.2 下标和切片
3.2.1 下标
正向下标,从0开始;负向下标,从-1开始;下标不能越界。
list1 = ['蜘蛛侠', '环太平洋', '海王', '复仇者联盟']
print(list1[2], list1[-2])
3.2.2 切片
左闭右开区间,从原来的容器中提取元素组成新的容器.切片可以越界。
变量[M:N:step]
M:起始范围(不写M,默认从头开始取);
N结束范围(不写,默认取到尾);
step步长(step=1,可以不写)。
1.起始范围和结束范围不写的时候,冒号必须存在;步长不写时,冒号不用写。
2.步长控制获取的元素,每间隔步长-1个元素获取一个元素(获取的当前元素+步长=下一个要获取的元素)。
3.M和N必须同符号:step>0,M<N;step<0,M>N。
4.正向下标和负向下标可以组合使用。
movies = ['阿甘正传', '肖申克的救赎', '霸王别姬', '三傻大闹宝莱坞', '环太平洋', '猿人泰山']
# 练习:
# a.获取['阿甘正传'、'霸王别姬'、'环太平洋']
print(movies[:5:2])
print(movies[:-1:2])
print(movies[::2])
# b.获取['肖申克的救赎'、'环太平洋']
print(movies[1:5:3])
print(movies[1:-1:3])
print(movies[1::3])
# c.获取['环太平洋'、'霸王别姬'、'阿甘正传']
print(movies[-2::-2])
# d.获取['猿人泰山'、'阿甘正传']
print(movies[::-5])
# e.获取['霸王别姬']
print(movies[2:3])
a = []
a.append(movies[2])
print(a)
b = [movies[2]]
print(b)
3.3 列表遍历
循环(遍历)
movies = [‘阿甘正传’, ‘肖申克的救赎’, ‘霸王别姬’, ‘三傻大闹宝莱坞’, ‘环太平洋’, ‘猿人泰山’]
3.3.1 直接遍历
for i in movies:
print(i)
3.3.2 间接遍历
len()能够查看容器的长度
print(len(movies))
for i in range(len(movies)):
print(movies[i])
3.3.3 enumerate():
将列表中每个元素及其对应的下标放入一个二元组,将所有的二元组存放在一个序列中
将列表转换为一个可迭代对象
print(enumerate(movies))
for i in enumerate(movies):
print(i)
练习:将下方列表中的元素从小到大排序。(冒号排序)
list1 = [23, 56, 10, 55, 76, 100, 30]
[23, 56, 10, 55, 76, 100, 30]
[23, 10, 55, 56, 76, 30, 100]
[10, 23, 55, 56, 30, 76, 100]
每趟排序,排序次数 + 1 = 本趟排序的元素个数
外层循环控制趟数
for i in range(1, len(list1)):
for j in range(0, len(list1) - i):
if list1[j] > list1[j + 1]:
list1[j], list1[j + 1] = list1[j + 1], list1[j]
print(list1)
3.4 列表运算
3.4.1 列表的重复
list1 = [1, 2, 3, 4]
print(list1 * 2)
3.4.2 列表的拼接
list2 =[ 4, 5, 6, 7]
print(list1 + list2)
3.4.3 成员运算
in 、not in — 结果是布尔值
print(3 in [1, 3, 4])
print([3] in [1 ,3,4])
print([3] in [1, 2, 3, [3]])
3.4.4 比较大小
a.比较大小的元素必须是同类型的
b.比较大小比较的是第一对不相等元素的大小(容器)
c.数字正常比较大小
list1 = [1, 2, '3', 4]
list2 = [1, 2, '4', 5]
print(list1<list2)
练习
有两个列表A和B,使用列表C来获取两个列表中公共的元素
A = [1, 'a', 4, 90]
B = ['a', 8, 'j', 1]
C = []
for i in A:
if i in B:
C.append(i)
print(C)
C = []
for i in A:
for j in B:
if i == j:
C.append(i)
print(C)
3.5 列表的方法和函数
3.5.1 max,min
获取同类型数据中最大值,最小值
num = [1, 2, 3, 4]
print(max(num))
print(min(num))
3.5.2 count
统计某个元素出现的个数
print(num.count(4))
print(num.count(5))
3.5.3 sum - 求和
print(sum(num))
3.5.4 reverse
将列表倒序,返回值为None,直接修改列表本身
num.reverse()
print(num)
print(num[::-1])
3.5.5 sorted
将列表从小到大排序,生成新列表
sorted(列表,reverse=False) - 从小到大(默认不写)
reverse = True - 从大到小排序
sort - 将列表从小到大排序,修改原列表
列表.sort(reverse=False)默认不写,降序
列表.sort(reverse=True)升序
num1 = [23 ,78 , 0, 90]
print(sorted(num1))
print(sorted(num1,reverse=True))
print(num1)
num1.sort(reverse=False)
print(num1)
num1.sort(reverse=True)
print(num1)
3.5.6 extend()
将一个容器中的元素添加到列表中
num1.extend('acdea')
print(num1)
3.5.7 index
查找元素
从左向右查找,找到元素立刻停止,返回下标
如果查找的元素不存在 - 报错
index1 = num1.index('a')
print(index1)
指定从下标为5的位置开始查找
index1 = num1.index('a',5)
print(index1)
练习:不使用index(),查找第二个a的下标
print('方法一:')
num1=[90, 78, 23, 0, 'a','b', 'c', 'd', 'e', 'a',1,2,3]
a_count = 0
for i in range(len(num1)):
if num1[i] == 'a':
a_count += 1
if a_count ==2:
print(i)
break
print('方法二:')
for i in range(6,len(num1)):
if num1[i] == 'a':
print(i)
print('方法三:')
for i,j in enumerate(num1):
if j == 'a':
print(i,end=' ')
3.6 列表去重
有一个列表,要求去掉重复的人名
names = ['张三', '李四', '大黄', '张三','张三']
方法一:
name=[]
for i in names:
if i not in name:
name.append(i)
print(name)
方法二:
names = ['张三', '李四', '大黄', '张三','张三', '李四', '李四']
for i in range(len(names)-1,-1,-1):
if names.count(names[i])>1:
del names[i]
print(names)
方法三:
names = ['张三', '李四', '大黄', '张三','张三', '李四', '李四']
index = 0
while index <= len(names) - 1:
if names.count(names[index]) > 1:
del names[index]
else:
index += 1
print(names)
3.7 列表推导式
列表推导式写法:列表推导式一般情况下代码简洁并且效率高。
语法一:[表达式 for 变量 in 容器]
num = [ i for i in range (1,101)]
print(num)
num_2 = [ 1 for _ in range(10)]
print(num_2)
语法二:[表达式 for 变量 in 容器 if 条件]
for循环执行一次,if分支判断一次,条件成立时表达式执行。
list3 = [i for i in range(1,101) if i % 2 ==0]
print(list3)
语法三:[表达式 for 变量 in 容器 for 变量 in 容器] - 向列表中添加元素
list4 = [i for i in range(3) for i in range(1,11)]
print(list4)
append()适用于所有向列表中追加元素的操作
列表推导式在某些情况下来替代append()
性能:列表推导式 > append()
练习1:利用列表推导式 存放指定列表中字符串的长度
list3 = ["good", "nice", "see you", "bye"]
len_list = [len(i) for i in list3]
print(len_list)
练习2:利用列表推导式将列表中的整数提取出来
list2 = [True, 17, "hello", "bye", 98, 34, 21]
new_list = [i for i in list2 if type(i) == int]
print(new_list)
3.8 随机模块
(1) random:随机模块
俄罗斯轮盘、抽奖等
import random
(2) randint(a,b) - 从[a,b]闭区间中随机获取一个整数。
randrange() - 约等于randint +range
print(random.randrange(1, 4, 2))
(3) choice() - 从容器中随机获取一个元素
print(random.choice([1, 2, 3, 4]))
(4) choices() - 从容器随机获取K个元素,有放回的抽取元素 - 放回抽取
print(random.choices([1,2,3,4],k=3))
(5) sample() - 从有序容器中无放回的抽取K个元素
print(random.sample([1,2,3,4],k=3))
(6) shffule() - 将有序容器随机打乱顺序,无返回值,修改序列本身
list1=[1,2,3,4]
print(random.shuffle(list1))
print(list1)
3.9 冒泡排序
已知条件:
a.序列中有N个元素,冒泡排序就进行N-1趟排序;
b.每趟排序结束以后,参与本趟排序的元素的最大值会出现在序列的最后方;
c.下一趟排序始终会比当前排序少一个元素。
C语言中两个变量值的交换
a = 3
b = 4
mid = a
a = b
b = mid
print(a,b)
Python中两个变量值的交换
i = 10
j = 20
i, j = j, i
print(i,j)
冒泡案例:
list1 = [10,25,3,55,90,76,20,30]
for i in range(1, len(list1)):
for j in range(0, len(list1) - i):
if list1[j] > list1[j + 1]:
list1[j], list1[j + 1] = list1[j + 1], list1[j]
print(list1)
print('最终结果:',list1)