{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 列表嵌套及排序"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Python中列表中的元素可以仍然是列表,如果一个列表中的每个元素都仍然是列表的话,就构成了列表嵌套。 \n",
"例如: \n",
"```python\n",
"scores = [['罗明', 95], ['金川', 85], ['戈扬', 80], ['罗旋', 78], ['蒋维', 99]]\n",
"```\n",
"scores被称为一个二维列表,它的每一个元素都仍是一个列表,这时仍然可以用索引和切片的方法对其进行访问和操作。 \n",
"每多一层嵌套,索引时就用多一组方括号。"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['金川', 85]\n",
"[['罗旋', 78], ['蒋维', 99]]\n",
"金川\n",
"85\n",
"['罗明', 95] ['金川', 85] ['戈扬', 80] ['罗旋', 78] ['蒋维', 99] \n",
"95 85 80 78 99 "
]
}
],
"source": [
"scores = [['罗明', 95], ['金川', 85], ['戈扬', 80], ['罗旋', 78], ['蒋维', 99]]\n",
"print(scores[1]) # 输出['金川', 85],这是列表scores的序号为1的元素\n",
"print(scores[3:5000]) #出序号为3和4的[['罗旋', 78], ['蒋维', 99]]\n",
"print(scores[1][0]) #'金川'这是列表scores的序号为1的元素['金川', 85]中,序号为0的元素\n",
"\n",
"print(scores[1][1]) # 85,这是列表scores的序号为1的元素['金川', 85]中,序号为1的元素\n",
"\n",
"for ls in scores:\n",
" print(ls,end = ' ') \n",
"# ['罗明', 95] ['金川', 85] ['戈扬', 80] ['罗旋', 78] ['蒋维', 99]\n",
"print()\n",
"\n",
"for ls in scores:\n",
" print(ls[1],end = ' ') # 输出每个元素中序号为1的元素,95 85 80 78 99 \n",
" \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"处理数据文件时,经常用遍历的方法,利用split()函数将每行数据转为一个列表,并做为列表的一个元素,整个文件被读取后,以一个二维列表的形式存在,可以利用索引和切片等方法,方便的对其中的数据进行分析和处理。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 实例 6.5 成绩统计分析进阶 "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"现在一个包含若干学生学习成绩的文件,每位同学有4 门课程的成绩,按要求完成以下任务。 \n",
"文件中每行数据格式如下:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"0121801101266,刘雯,92,73,72,64 \n",
"0121801101077,张佳喜,81,97,61,98 \n",
"… \n",
"0121801101531,佘玉龙,73,89,81,93 \n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"读取附件文件中的数据,对数据进行处理,计算每个同学 4 门课程成绩的平均成绩,将平均成绩置于课程成绩后一列,按照平均分升序排序后输出。\n",
" \n",
"根据以下输入要求,输出相应的数据: \n",
"输出平均分最高的同学名字与平均成绩,名字与分数间用一个空格分隔; \n",
"输出平均分最低的同学名字与平均成绩,名字与分数间用一个空格分隔; \n",
"输出按平均分从低到高的排序数据,要求每个数据之间以空格间隔,每行结尾无空格。 \n",
"输入一个学生的名字,输出该名同学所在行的的全部数据,各数据项间用一个空格分隔,结尾无空格; \n",
"如输入的姓名在文件中不存在,输出 '姓名不存在' "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"分析:可以使用列表推导式将文件中的数据转为一个二维列表: \n",
"```python\n",
"with open('images/ch6/5.5 score.txt','r',encoding='utf-8') as f: \n",
"ls = [i.strip().split(',') for i in f] \n",
"print(ls) \n",
"```\n",
"查看一下列表中的数据:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"```python\n",
"[['0121801101266', '刘雯', '92', '73', '72', '64'], \n",
" ['0121801101077', '张佳喜', '81', '97', '61', '98'], \n",
"… \n",
" ['0121801101531', '佘玉龙', '73', '89', '81', '93']] \n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"查看读取结果,发现所有数据都是字符串类型,如需用于数学运算,需将参与运算的数据转为整数。 \n",
"此例中可用`map(int,x[2:])`函数将列表中的成绩数据映射为整型,对映射结果用`sum()`函数求和再除以课程数量,即成绩列表的长度,即可得到4门课程的平均成绩。 \n",
"方法如下:\n",
"```python\n",
"sum(map(int,x[2:]))/len(x[2:]) \n",
"```\n",
"用列表推导式推导出每位同学的平均成绩,用拼接方法(+)为列表增加一个元素: \n",
"```python\n",
"score = [x + [sum(map(int,x[2:]))/len(x[2:])] for x in ls] \n",
"```\n",
"嵌套的二维列表排序可以应用lambda函数实现,语法为: \n",
"```python\n",
"sort(key=lambda x:x[n], reverse=True) \n",
"```\n",
"key参数为lambda函数(`lambda x:x[n]`),其中x 为传入的元素,此例中为内层的列表; \n",
"x[n] 为排序关键字,此例中为内层列表中序号为n 的元素。 \n",
"参数x可以是任意变量名,x[i]表示lambda函数返回列表中元素列表的第i个元素,此题中i值为1,表示根据列表中序号为1的元素(成绩)进行排序。\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[6.5 score.txt](images/ch6/6.5 score.txt)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"with open('images/ch6/6.5 score.txt','r',encoding='utf-8') as f:\n",
" ls = [i.strip().split(',') for i in f] # 文件中的数据转为二维列表\n",
"\n",
"# 计算平均成绩并加到每个列表元素中\n",
"score = [x + [sum(map(int,x[2:]))/len(x[2:])] for x in ls] \n",
"\n",
"score.sort(key = lambda x:x[6]) # 根据序列为6的元素(平均成绩)升序排序\n",
"\n",
"# 输出排序后的最后一个列表元素中姓名和平均成绩,即平均分最高的数据\n",
"print(score[-1][1],score[-1][-1]) \n",
"\n",
"# 输出排序后的第一个列表元素中姓名和平均成绩,即平均分最低的数据\n",
"print(score[0][1],score[0][-1]) \n",
"\n",
"# 输出增加了平均成绩并排序后的数据,*表示解包输出,也可用循环方式输出\n",
"[print(*x) for x in score] \n",
"\n",
"# 输入一个学生的名字,输出其全部信息,如姓名不存在,输出“姓名不存在”\n",
"name = input() # 输入一个同学的名字\n",
"if name in [x[1] for x in score]: # 如果名字在列表中存在\n",
" [print(*x) for x in score if x[1] == name] # 输出该同学的成绩数据\n",
"else:\n",
" print('姓名不存在')\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[6.5 score.txt](images/ch6/6.5 score.txt)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[['0121801101266', '刘雯', '92', '73', '72', '64'], ['0121801101077', '张佳喜', '81', '97', '61', '98'], ['0121801101249', '张红发', '88', '66', '71', '85'], ['0121813570483', '王昊煜', '93', '73', '71', '90'], ['0121801101092', '曹洋', '85', '62', '71', '76'], ['0121801101271', '徐肖剑', '83', '73', '97', '96'], ['0121801101565', '王雅楠', '94', '82', '96', '98'], ['0121801101864', '胡天旭', '63', '99', '78', '89'], ['0121801101930', '苏琪琦', '67', '61', '68', '74'], ['0121813570392', '项子烜', '64', '72', '85', '96'], ['0121813570159', '黄碧君', '94', '64', '92', '64'], ['0121801101664', '李欣', '62', '63', '92', '87'], ['0121801101825', '何乐', '67', '97', '74', '70'], ['0121801101707', '兰贵能', '70', '89', '77', '85'], ['0121801101950', '周淼', '91', '72', '72', '87'], ['0121801101345', '苏鹏', '100', '67', '83', '81'], ['0121813570765', '张周钊', '90', '80', '100', '74'], ['0121713590987', '张孜翰', '61', '85', '60', '74'], ['0121801101753', '张旭', '87', '100', '69', '65'], ['0121801101531', '佘玉龙', '73', '89', '81', '93']]\n"
]
}
],
"source": [
"with open('images/ch6/5.5 score.txt','r',encoding='utf-8') as f: \n",
" ls = [i.strip().split(',') for i in f] \n",
" print(ls) "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}