- images
- results
- .gitignore
- 1.1概论.ipynb
- 1.2 环境配置.pdf
- 1.3数据类型.ipynb
- 1.4 人机交互.ipynb
- 1.5 对象与变量.ipynb
- 1.6 编码与命名规范.ipynb
- 2.1 数值类型.ipynb
- 2.2 数值类型转换.ipynb
- 2.3 数值元算.ipynb
- 2.4常用数学运算函数.ipynb
- 2.5 math 模块及其应用.ipynb
- 2.6.1 逻辑值测试.ipynb
- 2.6.2 成员运算.ipynb
- 2.6.3 比较运算.ipynb
- 2.6.4 布尔运算.ipynb
- 2.6.5 运算优先级.ipynb
- 2.ipynb
- 3.1 流程控制结构.ipynb
- 3.3.1 for 循环语句.ipynb
- 3.3.3 rang.ipynb
- 3.3.3 while 循环语句.ipynb
- 3.4 and 3.5 分支结构和条件.ipynb
- 3.6 and 3.7 .ipynb
- 3.9 异常处理.ipynb
- 4 函数和模块化编程.ipynb
- 4.1 函数的定义、调用与返回值.ipynb
- 4.2 函数的参数传递.ipynb
- 4.3 变量的作用域.ipynb
- 4.4 匿名函数.ipynb
- 4.5 递归.ipynb
- 4.6 内置函数.ipynb
- 4.7 模块化程序设计.ipynb
- 5.1 序列通用操作.ipynb
- 5.1.1 索引.ipynb
- 5.1.2 切片.ipynb
- 5.1.3 序列拼接与重复.ipynb
- 5.1.4 成员测试.ipynb
- 5.2.1 字符串的创建.ipynb
- 5.2.2 字符串常量.ipynb
- 5.2.4 字符串的遍历.ipynb
- 5.2.5 文件遍历.ipynb
- 5.2.6 字符串的处理方法.ipynb
- 5.2.7 字符串格式化.ipynb
- 5.2.8 转义字符.ipynb
- 5.3 random 模块及其应用.ipynb
- 6.1 元组.ipynb
- 6.2 列表.ipynb
- 6.2.1 列表的创建.ipynb
- 6.2.2 列表的更新.ipynb
- 6.2.3 列表的删除.ipynb
- 6.2.4 列表的排序.ipynb
- 6.2.5 列表赋值与复制.ipynb
- 6.2.6 列表推导式.ipynb
- 6.2.8 常用内置函数.ipynb
- 6.2.9 列表嵌套及其排序.ipynb
- 6.3 列表综合应用.ipynb
- 7.1.1 集合的创建.ipynb
- 7.1.2可变集合类型的操作.ipynb
- 7.1.3 成员关系.ipynb
- 7.1.4 集合关系.ipynb
- 7.1.5 集合运算.ipynb
- 7.2.1 字典创建.ipynb
- 7.2.2 获取字典值.ipynb
- 7.2.3 修改字典值.ipynb
- 7.2.4内置函数与方法.ipynb
- 7.2.5字典排序输出.ipynb
- 7.3 集合与字典的应用.ipynb
- 8 中 numpy 概述.ipynb
- 8 中panda 库.ipynb
- 8.1 文件的打开与关闭.ipynb
- 8.2 文件读写操作.ipynb
- 8.3 文件的应用.ipynb
- 8.4 numpy 文件操作.ipynb
- 8.4.2 and 3.ipynb
- 8.5.1 pandas文件读写.ipynb
- 8.5.2 and 3 and 4.ipynb
- 9.1 matplotlib 线性图.ipynb
- 9.1.5 数据文化绘图.ipynb
- 9.2 非线性图.ipynb
- 9.3 词云.ipynb
- _overview.md
- _readme.ipynb
- coding_here.ipynb
- dream.png
- score.txt
- score_total.csv
- 成绩分析综合.json
6.2.9 列表嵌套及其排序.ipynb @master — view markup · raw · history · blame
列表嵌套及排序¶
Python中列表中的元素可以仍然是列表,如果一个列表中的每个元素都仍然是列表的话,就构成了列表嵌套。
例如:
scores = [['罗明', 95], ['金川', 85], ['戈扬', 80], ['罗旋', 78], ['蒋维', 99]]
scores被称为一个二维列表,它的每一个元素都仍是一个列表,这时仍然可以用索引和切片的方法对其进行访问和操作。
每多一层嵌套,索引时就用多一组方括号。
scores = [['罗明', 95], ['金川', 85], ['戈扬', 80], ['罗旋', 78], ['蒋维', 99]]
print(scores[1]) # 输出['金川', 85],这是列表scores的序号为1的元素
print(scores[3:5000]) #出序号为3和4的[['罗旋', 78], ['蒋维', 99]]
print(scores[1][0]) #'金川'这是列表scores的序号为1的元素['金川', 85]中,序号为0的元素
print(scores[1][1]) # 85,这是列表scores的序号为1的元素['金川', 85]中,序号为1的元素
for ls in scores:
print(ls,end = ' ')
# ['罗明', 95] ['金川', 85] ['戈扬', 80] ['罗旋', 78] ['蒋维', 99]
print()
for ls in scores:
print(ls[1],end = ' ') # 输出每个元素中序号为1的元素,95 85 80 78 99
处理数据文件时,经常用遍历的方法,利用split()函数将每行数据转为一个列表,并做为列表的一个元素,整个文件被读取后,以一个二维列表的形式存在,可以利用索引和切片等方法,方便的对其中的数据进行分析和处理。
实例 6.5 成绩统计分析进阶¶
现在一个包含若干学生学习成绩的文件,每位同学有4 门课程的成绩,按要求完成以下任务。
文件中每行数据格式如下:
0121801101266,刘雯,92,73,72,64
0121801101077,张佳喜,81,97,61,98
…
0121801101531,佘玉龙,73,89,81,93
读取附件文件中的数据,对数据进行处理,计算每个同学 4 门课程成绩的平均成绩,将平均成绩置于课程成绩后一列,按照平均分升序排序后输出。
根据以下输入要求,输出相应的数据:
输出平均分最高的同学名字与平均成绩,名字与分数间用一个空格分隔;
输出平均分最低的同学名字与平均成绩,名字与分数间用一个空格分隔;
输出按平均分从低到高的排序数据,要求每个数据之间以空格间隔,每行结尾无空格。
输入一个学生的名字,输出该名同学所在行的的全部数据,各数据项间用一个空格分隔,结尾无空格;
如输入的姓名在文件中不存在,输出 '姓名不存在'
分析:可以使用列表推导式将文件中的数据转为一个二维列表:
with open('images/ch6/5.5 score.txt','r',encoding='utf-8') as f:
ls = [i.strip().split(',') for i in f]
print(ls)
查看一下列表中的数据:
[['0121801101266', '刘雯', '92', '73', '72', '64'],
['0121801101077', '张佳喜', '81', '97', '61', '98'],
…
['0121801101531', '佘玉龙', '73', '89', '81', '93']]
查看读取结果,发现所有数据都是字符串类型,如需用于数学运算,需将参与运算的数据转为整数。
此例中可用map(int,x[2:])函数将列表中的成绩数据映射为整型,对映射结果用sum()函数求和再除以课程数量,即成绩列表的长度,即可得到4门课程的平均成绩。
方法如下:
sum(map(int,x[2:]))/len(x[2:])
用列表推导式推导出每位同学的平均成绩,用拼接方法(+)为列表增加一个元素:
score = [x + [sum(map(int,x[2:]))/len(x[2:])] for x in ls]
嵌套的二维列表排序可以应用lambda函数实现,语法为:
sort(key=lambda x:x[n], reverse=True)
key参数为lambda函数(lambda x:x[n]),其中x 为传入的元素,此例中为内层的列表;
x[n] 为排序关键字,此例中为内层列表中序号为n 的元素。
参数x可以是任意变量名,x[i]表示lambda函数返回列表中元素列表的第i个元素,此题中i值为1,表示根据列表中序号为1的元素(成绩)进行排序。
with open('images/ch6/6.5 score.txt','r',encoding='utf-8') as f:
ls = [i.strip().split(',') for i in f] # 文件中的数据转为二维列表
# 计算平均成绩并加到每个列表元素中
score = [x + [sum(map(int,x[2:]))/len(x[2:])] for x in ls]
score.sort(key = lambda x:x[6]) # 根据序列为6的元素(平均成绩)升序排序
# 输出排序后的最后一个列表元素中姓名和平均成绩,即平均分最高的数据
print(score[-1][1],score[-1][-1])
# 输出排序后的第一个列表元素中姓名和平均成绩,即平均分最低的数据
print(score[0][1],score[0][-1])
# 输出增加了平均成绩并排序后的数据,*表示解包输出,也可用循环方式输出
[print(*x) for x in score]
# 输入一个学生的名字,输出其全部信息,如姓名不存在,输出“姓名不存在”
name = input() # 输入一个同学的名字
if name in [x[1] for x in score]: # 如果名字在列表中存在
[print(*x) for x in score if x[1] == name] # 输出该同学的成绩数据
else:
print('姓名不存在')
with open('images/ch6/5.5 score.txt','r',encoding='utf-8') as f:
ls = [i.strip().split(',') for i in f]
print(ls)