内容正文:
单元7 文件和数据组织
任务7-3:超级计算机排序
【任务目标】
全球超级计算机排行榜2023年6月榜单中排名前10的超级计算机信息如表7-1所示。
编写程序,按峰值运算速度从高到低的顺序输出表7-1中的超级计算机信息。
【任务实施】
演示过程……
7.3 数据组织的维度
本节主要内容:
基本概念
一维数据的处理
二维数据的处理
数据排序
数据查找
7.3.1 基本概念
计算机在处理数据时,总是按一定的格式来组织数据。
数据的组织格式表明数据之间的基本关系和逻辑,进而形成“数据组织的维度”。
根据组织格式的不同,可将数据分为一维数据、二维数据和高维(或多维)数据。
1.一维数据
一维数据由具有对等关系的有序或无序的数据组成,采用线性方式组织。
数学中的集合和数组就是典型的一维数据。
例如,下面的一组专业名称就属于一维数据。
计算机应用,工程造价,会计学,影视动画
2.二维数据
二维数据也称为表格数据,由具有关联关系的数据组成,采用二维表格组织数据。
数学中的矩阵、二维表格都属于二维数据。
例如,下面的成绩表是一组二维数据。
3.高维数据
维度超过二维的数据都称为高维数据。
例如,成绩表加上学期,表示学生每学期的各科成绩,则构成三维数据。再加上学校信息,表示多个学校的学生在每个学期的各科成绩,则构成四维数据。
高维数据在Web系统中十分常见,例如,XML、JSON、HTML等格式均可用于表示高维数据。
高维数据通常使用JSON字符串表示,可以多层嵌套。
高维数据示例
下面的JSON字符串是两个学期的学生课程成绩数据。
{
"第一学期":[
{"姓名":"小明","语文":80,"数学":85,"物理":90},
{"姓名":"韩梅梅","语文":97,"数学":87,"物理"90:},
{"姓名":"李雷","语文":88,"数学":90,"物理":70} ],
"第二学期":[
{"姓名":"小明","语文":89,"数学":78,"物理":97},
{"姓名":"韩梅梅","语文":77,"数学":88,"物理":89},
{"姓名":"李雷","语文":97,"数学":76,"物理":88} ],
}
7.3.2 一维数据的处理
一维数据是简单的线性结构,在Python中可用列表表示,示例代码如下。
>>> 专业=['计算机应用','工程造价','会计学','影视动画']
>>> print(专业)
['计算机应用', '工程造价', '会计学', '影视动画']
>>> 专业[0]
'计算机应用'
一维数据可用文本文件进行存储,文件可使用空格、逗号、分号等作为数据的分隔符,示例代码如下。
计算机应用 工程造价 会计学 影视动画
计算机应用,工程造价,会计学,影视动画
计算机应用;工程造价;会计学;影视动画
在将一维数据写入文件时,除了写入数据之外,还需要额外写入分隔符。
在从文件读取数据时,需使用分隔符来分解字符串
>>> file=open(r'd:\data1.txt','w') #打开文本文件
>>>专业=['计算机应用','工程造价','会计学','影视动画'] #用列表表示一维数据
>>> for n in range(len(专业)-1): #将最后一个数据之前的数据写入文件
... file.write(专业[n]) #写入数据
... file.write(' ') #写入分隔符
...
>>> file.write(专业[n+1]) #写入最后一个数据
4
>>> file=open(r'd:\data1.txt') #重新打开文件
>>> print(file.read()) #输出从文件读取的数据
计算机应用 工程造价 会计学 影视动画
>>> file.seek(0)
0
>>> zy=file.read() #将文件数据读出,存入字符串
>>> zy
'计算机应用 工程造价 会计学 影视动画'
>>> data=zy.split(' ') #将字符串解析为列表,还原数据
>>> data
['计算机应用', '工程造价', '会计学', '影视动画']
7.3.3 二维数据的处理
二维数据可看作是嵌套的一维数据,即一维数据的每个数据项为一组一维数据。
可用列表来表示二维数据,示例代码如下。
>>> scores=[['姓名','语文','数学','物理'], ['小明',80,85,90],['韩梅梅',97,87,90],['李雷',88,90,70]]
可使用CSV文件存储二维数据,从文件读取二维数据时,应注意文件末尾的换行符的处理
>>> scores=[['姓名','语文','数学','物理'],
... ['小明',80,85,90],
... ['韩梅梅',97,87,90],
... ['李雷',88,90,70]]
>>>
>>> import csv
>>> file=open(r'd:\scores_data.txt','w+') #打开存储二维数据的文件
>>> writer=csv.writer(file) #创建CSV文件写对象
>>> for row in scores:
... writer.writerow(row) #将二维数据中的一行写入文件
...
>>> file.seek(0)
0
>>> print(file.read()) #输出从文件读取的数据
姓名,语文,数学,物理
小明,80,85,90
韩梅梅,97,87,90
李雷,88,90,70
>>> data=[] #创建空列表,用于存储从文件读取的二维数据
>>> file.seek(0) #将文件指针移动到文件开头
0
>>> reader=csv.reader(csvfile)
>>> for row in reader:
... if len(row)>0:
... data.append(row) #将非空行中的数据加入列表
...
>>> data #查看还原的二维数据
[['姓名', '语文', '数学', '物理'], ['小明', '80', '85', '90'], ['韩梅梅', '97', '87', '90'], ['李雷', '88', '90', '70']]
>>> for row in data:
... print('%8s\t%s\t%s\t%s' % (row[0],row[1],row[2],row[3]))#数据格式化输出
...
7.3.4 数据排序
常见的排序方法:选择排序、冒泡排序和插入排序。
Python列表的sort()方法和内置的sorted()函数均可用于排序
本节从算法的角度讲解各种常见的排序方法。
1.选择排序
选择排序的基本原理:
将n个数按从小到大排序。
首先从n个数中选出最小的数,将其与第1个数据交换;
然后对剩余的n-1个数采用同样的处理方法
经过n-1轮完成排序。
2.冒泡排序
冒泡排序的基本原理:
将n个数按从小到大排序。
首先,依次比较相邻的两个数,如果后面的数更小,则交换两个数的位置,经过这样一轮处理,最大的数据到了最后;
然后对剩余的前n-1个数采用同样的处理方法
经过n-1轮完成排序。
3.插入排序
插入排序的基本原理:
对n个数按从小到大排序。
将第1个数放入新列表,然后依次将剩余的n-1个数插入新列表。
每次在新列表中插入数据时,先查找应插入的位置,然后再插入数,保证新列表中的数始终按从小到大的顺序排列。
7.3.5 数据查找
1.顺序查找
基本原理:在线性表中按顺序查找指定元素。
2.二分法查找
基本原理:
二分法查找适用于有序的线性表。
假设线性表data中第一个元素的位置为start,最后一个元素的位置为end,在其中查找x。
查找的基本步骤如下。
(1)计算mid=(start+end)/2,取整数。
(2)如果x等于data[mid],则找到x,结束查找。
(3)如果x小于data[mid],令end=mid-1。如果end<start,表示线性表不包含x,结束查找,否则返回(1)。
(4)如果x大于data[mid],令start=mid+1。如果end<start,表示线性表不包含x,结束查找,否则返回(1)。
综合实例:登录密码验证
创建一个Python程序,将用户的id和密码以字典对象的格式存入文件,然后从文件读取数据,验证输入的id和密码是否正确。
$$