成绩项目积分项目

元组的文件和列表

在关于文件的入门课中,我们经常看到,当我们从文件中读取数据时,我们最终处理的是一个元组列表。在今天的课上,我们将会看几个程序的例子,这些程序从文件中读取元组列表,并对这些元组列表进行操作。

在之前关于元组的讲座中,我们也看到了当处理元组列表时,列表推导是一个非常常用的工具。今天的示例程序将展示更多的列表推导的例子,作为处理和转换元组列表的一种方法。

第一个例子:测验评分

对于我们的第一个示例程序,我们将编写一个程序来对一组测试进行评分。这个问题始于一个文本文件,其中包含一个测验分数列表。文件中的每一行都采用这种形式

<名称> <分数>

在第一轮处理中,我们希望从文件中读取这些数据,并将其组织为一个元组列表:

(<名称>,<分数>)

下面是程序中从文件构造这个元组列表的部分。

Data = [] with open("scores.txt") as f: for line in f.r readlines(): parts = line.split() Data .append((parts[0],int(parts[1])))

这次测试的分数有点低,所以我们要做的第一件事是对这些分数赢博体育一条曲线。为了计算曲线,我们计算测验的平均分数,然后计算平均值与目标值76之间的差值。

name = 0, score in data: sum += score average = sum/len(data) print(" average for the exam is ",average) curve = 76-average

接下来,我们构建一个新版本的数据列表,该列表的分数根据曲线量进行调整。这是一个使用列表推导式的自然机会:

曲线=[(姓名,分数+曲线)为姓名,分数]

最后,我们将使用标准刻度将每个分数转换为字母等级。这样做的第一步是定义一个将分数转换为字母等级的函数:

deflettergrade (score):如果分数>= 90:grade = 'A' elif分数>= 80:grade = 'B' elif分数>= 70:grade = 'C' elif分数>= 60:grade = ‘D‘否则:grade = ’F’返回分数

使用这个函数,我们可以构造另一个列表推导,将曲线分数列表转换为每个学生的字母分数列表。

grade =[(姓名,字母);grade(分数))为姓名,分数曲线]

最后一步是打印结果。

print('{:8s} {}'.format(Name, Grade))

第二个例子:计算附近的点

下一个示例项目涉及平面上的一组点。这些点存储在数据文件中,数据文件的每一行都有格式

<x坐标> <y坐标>

下面是从文本文件中读取这些点的代码。这段代码将点列表存储为元组列表。

Points = [] with open(' Points .txt') as f: for line in f.r readlines(): parts = line.split() point = (float(parts[0]),float(parts[1])) Points .append(point)

对于数据集中的每个点,我们想要计算有多少点接近该点。为了帮助我们解决这个问题,我构造了一个函数,它取一个点和一个点列表,并计算列表中有多少点接近给定的点。

import math def count_close(point,points,cutoff = 5): "“”计算有多少其他点在给定点的截止距离内。这个函数假设点是点列表中的一个点,并且不计算点本身。如果math.sqrt((x-point[0])**2+(y-point[1])**2) <= cutoff: count += 1返回count - 1

使用这个函数,我们现在可以建立一个列表推导,为我们提供原始数据集中每个点的附近点的计数:

count = [(point,count_close(point,points)) for point in points] for point, n in Counts: print(n," ",point)