master
/ 6.2.9 列表嵌套及其排序.ipynb

6.2.9 列表嵌套及其排序.ipynb @master

341084b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d487d71
341084b
d487d71
 
 
 
 
 
 
 
 
 
 
 
 
 
341084b
 
 
d487d71
341084b
 
 
 
 
 
 
 
 
 
d487d71
 
 
341084b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d487d71
341084b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d487d71
341084b
 
 
 
d487d71
341084b
 
 
d487d71
341084b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d487d71
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
341084b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
{
 "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
}