📌  相关文章
📜  国际空间研究组织 | ISRO CS 2011 |问题 78(1)

📅  最后修改于: 2023-12-03 15:07:33.907000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2011 |问题 78

问题描述

从一个带表头的文本文件中读入数据,其中第一行是表头,其余行是数据。表头包括若干个字段,字段之间用空格隔开。每一行数据也包括若干个字段,字段之间用空格隔开。编写一个程序,将数据存入数组中,并计算出其中每个字段的平均值。

输入

输入文件的第一行为两个整数$ 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()函数来输出结果。