01 列表相关函数和方法
1.列表(序列) 相关函数-- max min sum len sorted reversed
-
max(序列) - 获取最大(序列中的元素本身必须支持比较运算,并且元素之间可以比较大小
nums=[89, 23, 45, 890, 82, 40] print(max(nums))
-
min(序列) - 获取最小(序列中的元素本身必须支持比较运算,并且元素之间可以比较大小
print(min(nums))
-
sum(序列) – 求序列中所有元素的和(序列中元素必须是数字)
print(sum(nums)) print(sum(range(1, 101)))
-
len(序列) - 求序列中元素的个数
print(len([10,20,'abc',[10,20],range(3)]))
-
sorted(序列) - 将序列中元素从小到大排序,返回一个排完序后的新列表
-
sorted(序列,reverse = True) - 将序列中元素从大到小排序,返回一个排完序后的新列表
new_nums = sorted(nums) print(nums, new_nums) new_nums = sorted(nums,reverse=True) print(nums,new_nums)
-
reversed(序列) - 将序列中的元素倒序
new_nums = reversed(nums) print(new_nums) # 返回迭代器 <list_reverseiterator object at 0x0000028C8D9D9E88> for x in new_nums: print(x) # 得到元素 # 倒序 可用 切片倒序 print(nums[::-1])
-
list() - 将其他序列转换成列表 # 所有的序列都可以转换成列表
print(list('abc')) # ['a', 'b', 'c'] print(list(range(1,3))) # [1, 2]
2.列表相关方法
-
- 列表.clear() -清空列表
names = ['罗小黑战记', '海贼王', '一人之下', '进击的巨人', '死亡笔记'] names.clear() print(names) # [] # names=[] #也可以清空
-
2)列表.copy() - 复制原列表产生一个一模一样的新列表 与赋值不一样
names = ['罗小黑战记', '海贼王', '一人之下', '进击的巨人', '死亡笔记'] new_names = names.copy() print(new_names) # 直接赋值 names2 = names names.pop() # names的最后一个元素被删除,new_names不变 print(names2) # names2与names一样 print(names, new_names)
-
3)列表.count(元素) - 统计指定元素在列表中出现的次数
print(names.count('死亡笔记')) # 1 print(names.count('死神')) # 0
-
4)列表.extend(序列) - 将序列中所有的元素添加到列表中
names = ['罗小黑战记', '海贼王', '一人之下', '进击的巨人', '死亡笔记'] names.extend(['火影忍者','妖精的尾巴','123']) print(names) # ['罗小黑战记', '海贼王', '一人之下', '进击的巨人', '死亡笔记', '火影忍者', '妖精的尾巴', '123']
-
- 列表.index(元素) - 返回下标(从0开始)
names = ['罗小黑战记', '海贼王', '一人之下', '进击的巨人','海贼王','海贼王' ,'死亡笔记'] print(names.index('一人之下')) # 2 names = ['罗小黑战记', '海贼王', '一人之下', '进击的巨人', '死亡笔记'] names.extend(['火影忍者','妖精的尾巴','123']) print(names) # ['罗小黑战记', '海贼王', '一人之下', '进击的巨人', '死亡笔记', '火影忍者', '妖精的尾巴', '123'] print(names.index('火影')) #不存在->报错 print(names.index('海贼王'))
-
- 列表.reverse() - 将列表倒序(不会产生新的列表)
names = ['罗小黑战记', '海贼王', '一人之下', '进击的巨人', '死亡笔记', '海贼王'] names.reverse() print(names) # ['海贼王', '死亡笔记', '进击的巨人', '一人之下', '海贼王', '罗小黑战记']
-
- 列表.sort() - 将列表元素从小到大排序
nums = [78, 90, 67, 56, 99] new_nums = nums.sort() print(nums) # [56, 67, 78, 90, 99] print(new_nums) # None
02列表推导式
列表推导式 - 用来创建列表的表达式
推导式的应用:创建列表、元素筛选、元素的变换
-
- 推导式通用格式1
"""
[表达式 for 变量 in 序列]
创建列表的原理:
list1 = []
for 变量 in 序列:
list1.append(表达式)
"""
list1 = [x for x in range(4)]
print(list1)
list2 = [2*x + 3 for x in range(4)]
print(list2) # [3, 5, 7, 9]
list3 = [x*2 for x in 'abc']
print(list3)
# 练习:已知列表scores = [89, 34, 56, 23, 90, 100],将列表中的成绩转换成十分制的值
# scores = [89, 34, 56, 23, 90, 100] -> [8.9, 3.4, 5.6, 2.3, 9.0, 10.0]
score = [89, 34, 56, 23, 90, 100]
list4 = [x/10 for x in score] # [8.9, 3.4, 5.6, 2.3, 9.0, 10.0]
print(list4)
- 2.推导式通用格式2
"""
[表达式 for 变量 in 序列 if 条件语句]
原理:
list1=[]
for 变量 in 序列:
if 条件语句:
list1.append(表达式)
"""
nums =[23, 89, 34, 56, 23, 90, 100]
new_nums = [x for x in nums if x % 2 == 1]
print(new_nums)
# 练习:删除列表中所有的空值和0值
list1 = [12, 'abc', True, 0, 0.00, 0.02, '', [], [1, 2]]
# -> [12, 'abc', True, 0.02, [1, 2]]
new_list1 = [x for x in list1 if x]
print(new_list1)
- 3.补充:三目运算符
"""
1) C的三目运算符:
表达式1?表达式2:表达式3 -> 如果表达式1=0 结果为表达式3,否则为表达式2
2)python
变量=表达式2 if 表达式1 else表达式3 ->如果表达式1=0 结果为表达式3,否则为表达式2
"""
#
# age = 17
# if age >=18:
# result='成年'
# else:
# result='未成年'
#
age = 27
result = '成年' if age >= 18 else '未成年'
score = [89, 34, 56, 23, 90, 100]
new_score = ['及格' if x >= 60 else '不及格' for x in score]
print(new_score)
03推导式整理
-
1.整体变换 - 将原序列中的元素通过统一的规则转换成一个新的序列
# 方案: [表达式 for 变量 in 序列] - 表达式用来描述新序列中的元素和原序列元素之间的规则 nums = [23,789,90,67,22,31] # [3,9,0,7,2,1] result = [x % 10 for x in nums] print(result) # [3, 9, 0, 7, 2, 1]
-
2.部分变换(按照两种不同的方式变换)
# if 在前 # 方案:[三目运算 for 变量 in 序列] list1 = [23, 'abc', 78, '234', 1.23, [10,30]] # [230, 'abc', 780, '234', 12.3, [10,30]] 部分*10 仅数字 # new_list1=[x*10 if type(x) == int or type(x) == float else x for x in list1] # 两个选择 in [] new_list1=[x*10 if type(x) in [int,float] else x for x in list1] print(new_list1)
-
3.筛选、删除
# if在后 # 方案:[表达式 for 变量 in 序列 if 条件语句] scores = [89, 33, 67, 8, 98, 23, 66, 81] result=[x for x in scores if x >= 60] print(result) # [89, 67, 98, 66, 81]
04元组
-
1.什么是元组 (tuple)
""" 元组是容器型数据类型(序列),将()作为容器标志,里面多个元素用逗号隔开(元素1,元素2,...) 元组是不可变的(不支持增删改)、元组是有序的(支持下标操作) 任何类型的数据都可以作为元组的元素 """
-
1)空元组
t1 = () print(t1, type(t1), len(t1)) # () <class 'tuple'> 0
-
2)只有一个元素的元组:元素后面的逗号不能省
l1 = [100] print(l1, type(l1), len(l1)) # [100] <class 'list'> 1 t2 = (100) print(t2, type(t2)) # [100] <class 'list'> t3 = (100,) print(t3, type(t3)) # (100,) <class 'tuple'>
-
3)普通
t4 =(10, 12.9, 'abc', 10) print(t4, type(t4)) # (10, 12.9, 'abc', 10) <class 'tuple'>
-
-
2.元组就是不可变的列表 – 列表中凡是和增删改不相关的操作元组都支持
-
1)查:单个元素,切片,遍历
t5 = ('肖申克的救赎','阿甘正传','霸王别姬','美丽人生','黑客帝国','触不可及','这个杀手不太冷','V字仇杀队') print(t5[1]) # 阿甘正传 print(t5[-1]) # V字仇杀队 # print(t5[100]) # 越界报错 # 切片 -- 类型是元组 print(t5[1:]) # ('阿甘正传', '霸王别姬', '美丽人生', '黑客帝国', '触不可及', '这个杀手不太冷', 'V字仇杀队') print(t5[3:0]) # () 空 print(t5[2:-2:2]) # ('霸王别姬', '黑客帝国') # 遍历 for x in t5: print('x=', x) for index in range(len(t5)): print(index,t5[index])
-
2)+ - * in /not in
# 加法 l2 =[1,2,3] result = l2+[10,20] print(result,l2) # [1, 2, 3, 10, 20] [1, 2, 3] t6 =(10,20) print(t6 + (100,200)) # (10, 20, 100, 200) print(t6 * 3) # (10, 20, 10, 20, 10, 20) # in/ not in print(1 in t6) # False
-
3)max min sum sorted reversed len tuple
scores = (98, 78, 67, 56, 23, 45, 99, 82, 86) print(max(scores)) # 99 print(min(scores)) # 23 print(sorted(scores)) # 列表 [23, 45, 56, 67, 78, 82, 86, 98, 99] print(tuple([10, 230, 4])) # 转元组 (10, 230, 4)
-
4)相关方法: count、index
print(scores.count(99)) # 1 print(scores.index(56)) # 3
-
-
3.元组不只是不可变列表
-
1) 元组的()在没有歧义的情况下可以去掉
t1 = 10,20,30 print(t1,type(t1)) #(10, 20, 30) <class 'tuple'> t2 = 10,20,30 *2 print(t2) # (10, 20, 60)
-
2) 获取元组元素:让变量个数和元组中元素个数一致
point1 =(10,98) x,y = point1 print(x,y) # 10 98 point2 =(-19,89,29) x,y,z = point2 print(x, y, z) # -19 89 29 # x,y =point2 # ValueError: too many values to unpack (expected 2) # z1,y1,z1,t1 = point2 # ValueError: not enough values to unpack (expected 4, got 3)
-
3)获取元组元素:让变量个数小于元组中元素的个数,但是必须在某一个变量前加*
# 先让不带*的变量按照位置去获取元组中的元素,然后让剩下的元素全部作为一个列表返回给带*的变量 t2 = (100, 200, 'abc', '男', 'True', 300) *x,y,z = t2 print(y,z) # True 300 (没有取到的都赋给*) print(x) # [100, 200, 'abc', '男'] 列表 x,y,*z = t2 print(x,y) # 100 200 print(z) # ['abc', '男', 'True', 300] x,*y,z = t2 print(x,z) # 100 300 print(y) # [200, 'abc', '男', 'True'] x,*y,z,t =t2 print(y) # [200, 'abc', '男']
-
05认识字典
# 定义一个变量保存一个学生的信息
name = '小明'
age = 30
height = 170
name2 = '张三'
age2 = 40
#f2
stu1 = ['小明',18,170,74,80,'男']
print(stu1[0])
# 字典
stu2 = {'姓名':'小明','age':30,'height':170,'weight':74,'score':80,'性别':'男'}
print(stu2['姓名'])
students=[
{'name':'小明','age':30,'tel':'566245'},
{'name':'小明','age':30,'tel':'566245'},
{'name':'小明','age':30,'tel':'566245'}
]
c1 ={
'name':'小明',
'age':30,
'tel':'566245',
'teacher':[
{},
{},
{}
],
'students':[
{},
{},
{}
]
}
作业
1.创建一个列表,列表中有10个数字, 保证列表中元素的顺序,对列表进行排重,并对列表使用进行降序排序
例如:随机生成了[70, 88, 91, 70, 107, 234, 91, 177, 282, 197]
--- 去重之后 [70, 88, 91, 107, 234, 177, 282, 197]
---- 降序排序 [282, 234, 197, 177, 107, 91, 88, 70]
list1=[70, 88, 91, 70, 107, 234, 91, 177, 282, 197]
new_list1 = []
for x in list1:
if x not in new_list1:
new_list1.append(x)
print(new_list1)
new_list1.sort(reverse=True)
print(new_list1)
2.利用列表推导式, 完成以下需求
a. 生成一个存放1-100中个位数为3的数据列表
结果为 [3, 13, 23, 33, 43, 53, 63, 73, 83, 93]
result=[x for x in range(1,100) if x % 10 == 3]
print(result)
b. 利用列表推到是将 列表中的整数提取出来
例如:[True, 17, "hello", "bye", 98, 34, 21] --- [17, 98, 34, 21]
list2 = [True, 17, "hello", "bye", 98, 34, 21]
new_list2=[x for x in list2 if type(x) == int]
print(new_list2)
c.利用列表推导式 存放指定列表中字符串的长度
例如: ["good", "nice", "see you", "bye"] --- [4, 4, 7, 3]
list3 = ["good", "nice", "see you", "bye"]
new_list3=[len(x) for x in list3]
print(new_list3)
d. 利用列表推导式删除列表中整数个位数小于5的元素
例如:[24, 'abc', 99, True, 21, 38, 'hello'] --- ['abc', 99, True, 38, 'hello']
list4 = [24, 'abc', 99, True, 21, 38, 'hello']
print(list4)
new_list4=[x for x in list4 if type(x) != int or x % 10 >= 5]
print(new_list4)
e. 利用列表推导式获取元素是元组的列表中每个元组的最后一个元素
例如:[(10, 20, 30), ('abc', 'hello'), (1, 2, 3.4), (True, False)] --- [30, 'hello', 3.4, False]
list5 = [(10, 20, 30), ('abc', 'hello'), (1, 2, 3.4), (True, False)]
new_list5=[x[-1] for x in list5]
print(new_list5)
3.已知代码如下,请回答出各个print的结果 并说明原因
nums = [17, 39, 28, 51]
nums2 = nums
nums2.pop()
print(len(nums)) # 这个结果是什么 请描述原因
# 结果为3
"""
nums2 = nums 直接复制操作,nums2,nums指向相同的地址
删除nums2指向列表的最后一个元素,等价于删除nums指向列表的最后一个元素
所以nums列表长度减1
"""
numlist = [17, 22, 39, 58, [55, 43]]
nums3 = numlist.copy()
print(numlist is nums3) # 结果 原因是什么
"""
结果是:False
copy()是产生了新的列表
nums3指向新列表,numlist指向原列表
两个列表地址并不相同
"""
numlist[-1][0] = 99
print(nums3) # num3会不会发生变化
"""
num3不会发生变化
修改的是numlist的值
而nums3未被修改
"""
4(试一下). 定义一个列表,在列表中保存6个学生的信息(学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明) )
a.统计不及格学生的个数
b.打印不及格学生的名字和对应的成绩
c.统计未成年学生的个数
d.打印手机尾号是8的学生的名字
e.打印最高分和对应的学生的名字
f.删除性别不明的所有学生
g.将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
students=[
{'name':'小明','age':30,'score':90,'tel':'566245','性别':'女'},
{'name':'小红','age':25,'score':80,'tel':'566245','性别':'男'},
{'name':'小张','age':20,'score':50,'tel':'566245','性别':'女'},
{'name':'小赵','age':17,'score':63,'tel':'566245','性别':'未知'},
{'name':'小李','age':18,'score':70,'tel':'566245','性别':'男'},
{'name':'小吴','age':19,'score':90,'tel':'566245','性别':'女'},
]
#a.统计不及格学生的个数
count =0
for i in range(len(students)):
if students[i]['score'] < 60:
count +=1
print(count)
# 1
# b.打印不及格学生的名字和对应的成绩
for i in range(len(students)):
if students[i]['score'] < 60:
print(students[i]['name'],students[i]['score'])
# 小张 50
# c.统计未成年学生的个数
count1=0
for i in range(len(students)):
if students[i]['age'] < 18:
count1 += 1
print(count1)
#3
# d.打印手机尾号是8的学生的名字
for i in range(len(students)):
if int(students[i]['tel']) % 10 == 8:
print(students[i]['name'])
# 小张
# 小吴
# e.打印最高分和对应的学生的名字
max1 =0
index1=[]
for i in range(len(students)):
if students[i]['score'] >= max1:
max1 = students[i]['score']
index1.append(i)
#print(index1)
for x in index1:
print(students[x]['score'],students[x]['name'])
#90 小明
#90 小吴
# f.删除性别不明的所有学生
new_students = []
for i in range(len(students)):
if students[i]['性别'] != '未知':
new_students.append(students[i])
print(new_students)
# [{'name': '小明', 'age': 30, 'score': 90, 'tel': '566245', '性别': '女'}, {'name': '小红', 'age': 25, 'score': 80, 'tel': '566247', '性别': '男'}, {'name': '小张', 'age': 20, 'score': 50, 'tel': '566278', '性别': '女'}, {'name': '小李', 'age': 12, 'score': 70, 'tel': '566235', '性别': '男'}, {'name': '小吴', 'age': 15, 'score': 90, 'tel': '566298', '性别': '女'}]
# g.将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
new_students2 = []
for i in range(len(students)):
new_students2.append(students[i]['score'])
#print(new_students2)
new_students2.sort(reverse=True)
print(new_students2)
# [90, 90, 80, 70, 63, 50]