📅  最后修改于: 2023-12-03 15:07:33.907000             🧑  作者: Mango
从一个带表头的文本文件中读入数据,其中第一行是表头,其余行是数据。表头包括若干个字段,字段之间用空格隔开。每一行数据也包括若干个字段,字段之间用空格隔开。编写一个程序,将数据存入数组中,并计算出其中每个字段的平均值。
输入文件的第一行为两个整数$ n $和$ m $,分别表示数据的行数和每行的字段数($ 1 \le n \le 100 $,$ 1 \le m \le 20 $)。接下来$ n+1 $行,每行包含若干个用空格隔开的字符串,第$ 1 $行为表头,第$ 2 \sim n+1 $行为数据。
程序首先输出从输入文件中读取出的表头和数据。然后输出每一列数据的平均值,保留两位小数。
输入:
3 3
number name score
001 ZhangSan 90
002 LiSi 87
003 WangWu 67
输出:
number name score
001 ZhangSan 90
002 LiSi 87
003 WangWu 67
Average: 001 002 003 ZhangSan LiSi WangWu 81.33 81.33 81.33
Average: 90.00 87.00 67.00
# 从文件读入数据
with open('test.txt', 'r') as f:
data = f.readlines()
n, m = map(int, data[0].split()) # 获取数据的行数和每行的字段数
titles = data[1].split() # 标题
datas = [x.split() for x in data[2:]] # 数据
# 输出表头和数据
print(" ".join(titles))
for dat in datas:
print(" ".join(dat))
# 计算每列的平均值
averages = []
for i in range(m):
s = 0
for dat in datas:
s += float(dat[i+1])
ave = round(s/n, 2)
averages.append(ave)
# 输出每列的平均值
print("Average: " + " ".join([titles[i] for i in range(1, m+1)]) + " " + " ".join([str(x) for x in averages]))
解释:
首先,我们要从文件中读取数据,使用open()
函数打开文件并利用readlines()
函数一次性读取文件的所有内容。接着,从文件中读取到的第一行中,通过map()
函数得到数据的行数$ n $和每行的字段数$ m $,并从第二行中获取到个字段的名称$ titles $。从第三行开始,我们将数据行存储到$ datas $数组中。
随后,我们需要打印出表头和数据。这里我们使用join()
函数及循环语句来实现。
最后,我们需要计算每列的平均值并输出。需要注意的是,我们要从第二个字段开始循环,并使用float()
函数将字符串转换为浮点数类型。最后,我们使用round()
函数进行四舍五入,保留两位小数,将结果存储在$averages$列表中。
最后,我们将每个字段的名称、平均值拼接成字符串,并使用join()
函数来输出结果。